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

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

编辑:

好的,现在差不多可以用了。当使用setUsesThreadedAnimation时:并从 MenuDelegate 的 menuWillOpen 并创建一个新线程。该线程运行本地方法:

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

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

有帮助吗?

解决方案

通过使用:

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

在菜单上的菜单中:问题似乎一直在调用startAnimation:在进度栏完成绘制之前。

其他提示

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

另外,您打电话的地点和时间 startAnimation:?(我们需要查看一些代码)。

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

如果您确实拥有对 UI 对象的(可能)有效引用,那么您会看到的另一个常见问题是开发人员尝试“过早”向该对象发送消息时。一般来说, init 方法在控制器对象的生命周期中还为时过早,无法将消息发送到用户界面对象 - 那些 IBOutlet仍然是 nil. 。到......的时候 -awakeFromNib 叫做, IBOutlet应该是有效的(前提是您将它​​们连接到 IB 中),然后您可以将消息发送到 UI 对象。

您是否告诉过它通过-SetUsesthreadAnimation使用螺纹动画:?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top