NSProgressIndicator внутри NSPopupButton

Я пытаюсь понять, как заставить счетчик анимироваться в пункте меню 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];

Я отредактировал это, чтобы обновить свою проблему


person JPC    schedule 10.11.2012    source источник
comment
Вы получаете уведомление? Вы проверяли с помощью BreakPoint?   -  person Anoop Vaidya    schedule 10.11.2012
comment
Уведомление вызывается. Проверено с помощью точки останова / регистрации   -  person JPC    schedule 10.11.2012


Ответы (1)


Попробуйте так:

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

Внутри menuWillOpen: проблема, похоже, вызывала startAnimation: до того, как индикатор выполнения закончил рисовать себя.

Как вы ссылаетесь на NSProgressIndicator, который находится в представлении (и, если на то пошло, в окне)? Например, есть ли у вас класс контроллера, в котором IBOutlet подключен к индикаторам выполнения? Если вы используете IBOutlet, вы уверены, что он правильно подключен в файле пера?

Кроме того, где и когда вы вызываете startAnimation:? (Нам нужно увидеть код).

Иногда может случиться так, что вы забудете подключить IBOutlet к перу. Затем, когда вы пытаетесь сказать объекту что-то сделать в коде во время выполнения, IBOutlet равен нулю, и поэтому то, что вы считаете сообщением, отправляемым вашему объекту, на самом деле является сообщением, отправляемым nil. Другими словами, это просто игнорируется и фактически выглядит так, как будто оно не работает.

Если у вас есть (потенциально) действительная ссылка на объект пользовательского интерфейса, другая распространенная проблема, с которой вы столкнетесь, — это когда разработчик пытается отправить сообщение объекту «слишком рано». В общем, методы init находятся слишком рано во времени существования объекта контроллера, чтобы иметь возможность отправлять сообщения объектам пользовательского интерфейса — эти IBOutlet по-прежнему равны нулю. К моменту вызова -awakeFromNib IBOutlet должны быть действительны (при условии, что вы подключили их в IB), и вы можете отправить сообщение объекту пользовательского интерфейса.

person Anoop Vaidya    schedule 10.11.2012
comment
Кажется, это помогает, но я чувствую, что мне не нужно вызывать селектор выполнения. Есть ли время после того, как меню отрисовывается и показывает, что я могу вызвать анимацию? - person JPC; 10.11.2012
comment
нет... вы не можете полагаться на время... это зависит от процессора и рабочей нагрузки... так что вызывайте его селектором. - person Anoop Vaidya; 10.11.2012