【问题标题】:Using NSProgressIndicator inside an NSMenuItem在 NSMenuItem 中使用 NSProgressIndicator
【发布时间】:2011-01-12 16:11:34
【问题描述】:

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

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

编辑:

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

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

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

【问题讨论】:

    标签: objective-c cocoa nsview nsmenuitem nsprogressindicator


    【解决方案1】:

    通过使用解决它:

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

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

    【讨论】:

    • 非常感谢您的建议,它真的很有帮助!
    • 疯了多久我一直在寻找使这项工作,非常感谢!
    • 谢谢哥们!谢谢哥们!谢谢哥们!
    • 似乎即使这对 High Sierra 也没有帮助,尽管在 Sierra 和波纹管上工作正常(可能与此 forums.developer.apple.com/thread/83186 有关)
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 好点,这解释了为什么我有时在尝试访问出口组件时确实有零值(过早地调用它们)。现在我似乎把它缩小到一个绘图问题。当包含视图的菜单项被突出显示时(在我的视图的 drawRect:) 中,我已使其动画化,然后在不再突出显示时使其停止。但是,如果我尝试使它在 if 子句之外设置动画,以检查项目是否突出显示,则没有任何反应(仍在 drawRect 内部:)。
    • 我已经设法让它工作得更多了,似乎我必须在之前的某个时间发送 stopAnimation: 才能使 startAnimation: 工作。但是我希望它在显示菜单时(或不显示)动画。目前我必须将鼠标悬停在视图上才能启动,当它们显示菜单时,它只显示进度条没有动画,即使它不应该隐藏(setDisplayWhenStopped:NO)。在下一条评论中继续...
    • 当从我的视图对象外部调用它时,我仍然无法让它工作,例如在其控制器类中导航 NSMenu 的子视图。似乎在显示菜单时必须有某种事件才能使动画起作用。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-27
      相关资源
      最近更新 更多