7

我正在尝试在状态栏菜单中使用 NSProgressIndicator(不确定)。我使用 NSView 对象作为菜单项的视图,然后对进度指示器进行子视图以显示它。但是每当我尝试调用 startAnimation: 时,什么都没有发生。当我尝试在普通的 NSWindow 上做同样的事情时,它可以完美地工作,只是在 menuitem 内时不行。

我对可可和objective-c都是新手,所以我可能忽略了一些“明显”的东西,但我已经搜索了很多解决方法但没有成功。我发现一些关于菜单项的内容在显示时无法更新,您需要使用无边框窗口。但我无法在任何文档中确认这一点。

编辑:

好的,现在几乎可以工作了。当使用 setUsesThreadedAnimation: 并从一个 MenuDelegate 的 menuWillOpen 中创建一个新线程。该线程运行一个本地方法:

-(void) doWork(NSProgressIndicator*) p{
     [p startAnimation:self];
}

这将在打开菜单时随机(?)启动进度指示器。如果我startAnimation:不经过就直接调用doWork:(仍然使用新线程),它永远不会起作用。进度条不会setUsesThreadedAnimation:为动画创建自己的线程吗?

4

3 回答 3

16

通过使用解决它:

[progressIndicator performSelector:@selector(startAnimation:)
                            withObject:self
                            afterDelay:0.0
                               inModes:[NSArray 
                       arrayWithObject:NSEventTrackingRunLoopMode]];

在 menuWillOpen: 内部,问题似乎是在进度条完成绘制之前调用 startAnimation:。

于 2011-01-14T14:40:56.630 回答
1

您如何引用NSProgressIndicator视图中的那个(以及窗口中的那个)?例如,您是否有一个IBOutlet连接到进度指示器的控制器类?如果您使用的是IBOutlet,您确定它已正确连接到 nib 文件中吗?

另外,您在何时何地打电话startAnimation:?(我们需要看一些代码)。

有时会发生的一件事是您忘记IBOutlet在笔尖上连接一个。然后,当您试图告诉对象在运行时在代码中执行某些操作时,IBOutlet就是nil,因此您认为发送给对象的消息实际上是发送给 的消息nil。换句话说,它只是被忽略了,实际上看起来它不起作用。

如果您确实(可能)有对 UI 对象的有效引用,那么您将看到的另一个常见问题是开发人员试图在“太早”的时间向对象发送消息时。一般来说,init方法在控制器对象的生命周期中太早了,无法向用户界面对象发送消息——那些IBOutlet仍然是nil. 到-awakeFromNib调用的时候,IBOutlet's 应该是有效的(假设你在 IB 中连接了它们),然后你可以将消息发送到 UI 对象。

于 2011-01-12T21:26:31.523 回答
0

你有没有告诉它通过 -setUsesThreadedAnimation: 使用线程动画?

于 2011-01-12T20:35:34.643 回答