Использование NSProgressIndicator внутри NSMenuItem - PullRequest
6 голосов
/ 12 января 2011

Я пытаюсь использовать NSProgressIndicator (неопределенный) внутри меню состояния строки.Я использую NSView-объект в качестве представления для элемента меню, а затем просматриваю индикатор прогресса для его отображения.Но всякий раз, когда я пытаюсь вызвать startAnimation: для прогресса ничего не происходит.Когда я пытаюсь сделать то же самое на обычном NSWindow, оно работает отлично, но только не внутри меню.

Я новичок в какао и в объективе-c, так что я мог пропустить что-то "очевидное"но я довольно долго искал обходной путь, но безуспешно.Я обнаружил, что некоторые элементы меню не могут быть обновлены, пока они показаны, и что вместо этого вам нужно использовать окно без полей.Но я не смог подтвердить это ни в одной документации.

Редактировать:

Хорошо, почти работает сейчас.При использовании setUsesThreadedAnimation: и из меню MenuDelegateWillOpen и создании нового потока.Этот поток запускает локальный метод:

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

Это будет запускать индикатор прогресса случайным образом (?) При открытии меню.Если я вызываю startAnimation: напрямую, не проходя через doWork: (все еще используя новый поток), это никогда не сработает.Разве setUsesThreadedAnimation: не заставляет индикатор выполнения создавать собственный поток для анимации?

Ответы [ 3 ]

16 голосов
/ 14 января 2011

Решил, используя:

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

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

1 голос
/ 13 января 2011

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

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

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

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

0 голосов
/ 12 января 2011

Вы сказали ему использовать потоковую анимацию через -setUsesThreadedAnimation:?

...