NSPopressButton中的NSProgressIndicator

时间:2012-11-10 01:18:05

标签: objective-c cocoa nspopupbutton nsprogressindicator

我正在试图弄清楚如何让一个微调器在NSPopupButton的菜单项上设置动画。我不能让微调器动画。它似乎但它没有做任何事情。

到目前为止,我已经将微调器添加到菜单项中,如下所示:

_spinner = [[NSProgressIndicator alloc] initWithFrame:NSMakeRect(0,0,16,16)];
[_spinner setIndeterminate:YES];
[_spinner setStyle:NSProgressIndicatorSpinningStyle];
[_spinner setControlSize:NSSmallControlSize];
[_spinner setDisplayedWhenStopped:YES];
[_spinner setHidden:NO];

NSMenuItem *item = [[button menu] itemWithTag:0];
[item setView:_spinner];

我在听NSPopUpButtonWillPopUpNotification。当我收到通知时,我会这样做但旋转器出现并且没有动画:

[_spinner setUsesThreadedAnimation:YES];
[_spinner startAnimation:nil];

我编辑了这个以更新我的问题

1 个答案:

答案 0 :(得分:1)

尝试这种方式:

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

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

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

此外,您在何时何地呼叫startAnimation:? (我们需要看一些代码)。

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

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