0

我试图弄清楚如何让微调器在 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];

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

4

1 回答 1

1

试试这种方式:

[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。到 -awakeFromNib 被调用时,IBOutlet 应该是有效的(前提是您在 IB 中连接了它们),然后您可以将消息发送到 UI 对象。

于 2012-11-10T02:25:56.810 回答