繁体   English   中英

在NSMenuItem中使用NSProgressIndicator

[英]Using NSProgressIndicator inside an NSMenuItem

我正在尝试在状态栏菜单中使用NSProgressIndicator(不确定)。 我正在使用NSView对象作为menuitem的视图,然后查看进度指示器以显示它。 但每当我尝试调用startAnimation时:对于进度,没有任何反应。 当我尝试在普通的NSWindow上做同样的事情时,它可以很好地工作,而不是在一个menuitem中。

我是cocoa和objective-c的新手,所以我可能会忽略一些“显而易见的”但我已经搜索了很多但是没有成功。 我发现一些关于menuitems的东西在显示时无法更新,你需要使用无边框窗口。 但我无法在任何文档中证实这一点。

编辑:

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

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

这将在打开菜单时以随机(?)为基础启动progressindicator。 如果我直接调用startAnimation:而不通过doWork:仍然使用新线程),它永远不会工作。 没有setUsesThreadedAnimation:让进度条为动画创建自己的线程?

通过使用解决它:

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

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

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

另外,你在何时何地调用startAnimation: (我们需要看一些代码)。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM