在 NSMenuItem 中使用 NSProgressIndicator
-
10-10-2019 - |
题
我正在尝试在状态栏菜单内使用 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
在笔尖。然后,当您尝试告诉对象在运行时在代码中执行某些操作时, IBOutlet
是 nil
, ,因此您认为发送到对象的消息实际上是发送到的消息 nil
. 。换句话说,它只是被忽略了,并且看起来实际上不起作用。
如果您确实拥有对 UI 对象的(可能)有效引用,那么您会看到的另一个常见问题是开发人员尝试“过早”向该对象发送消息时。一般来说, init
方法在控制器对象的生命周期中还为时过早,无法将消息发送到用户界面对象 - 那些 IBOutlet
仍然是 nil
. 。到......的时候 -awakeFromNib
叫做, IBOutlet
应该是有效的(前提是您将它们连接到 IB 中),然后您可以将消息发送到 UI 对象。
您是否告诉过它通过-SetUsesthreadAnimation使用螺纹动画:?