Использование NSProgressIndicator внутри NSMenuItem
Я пытаюсь использовать NSProgressIndicator (неопределенный) внутри меню состояния строки. Я использую NSView-объект в качестве представления для элемента меню, а затем просматриваю индикатор прогресса для его отображения. Но всякий раз, когда я пытаюсь вызвать startAnimation: для прогресса ничего не происходит. Когда я пытаюсь сделать то же самое на обычном NSWindow, оно работает отлично, но только не внутри меню.
Я новичок как в какао, так и в цели-c, так что, возможно, я упустил что-то "очевидное", но я довольно долго искал обходной путь, но безуспешно. Я обнаружил, что некоторые элементы меню не могут быть обновлены во время показа, и что вместо этого вам нужно использовать окно без полей. Но я не смог подтвердить это ни в одной документации.
Редактировать:
Хорошо, почти работает сейчас. При использовании setUsesThreadedAnimation: и из меню MenuDelegateWillOpen и создании нового потока. Этот поток запускает локальный метод:
-(void) doWork(NSProgressIndicator*) p{
[p startAnimation:self];
}
Это запустит индикатор прогресса случайным образом (?) При открытии меню. Если я позвоню startAnimation:
прямо, не проходя через doWork:
(все еще используя новую тему), это никогда не работает. не setUsesThreadedAnimation:
заставить прогресс-бар создать свой собственный поток для анимации?
3 ответа
Решил это с помощью:
[progressIndicator performSelector:@selector(startAnimation:)
withObject:self
afterDelay:0.0
inModes:[NSArray
arrayWithObject:NSEventTrackingRunLoopMode]];
Внутри меню WillOpen: кажется, проблема в том, что вызывается startAnimation: до того, как индикатор выполнения закончил сам рисунок.
Как вы ссылаетесь на NSProgressIndicator
то есть в представлении (и в окне, если на то пошло)? Например, у вас есть класс контроллера, который имеет IBOutlet
подключен к показателям прогресса? Если вы используете IBOutlet
, вы уверены, что он правильно подключен в nib-файле?
Кроме того, куда и когда ты звонишь startAnimation:
? (Нам нужно увидеть код).
Иногда может случиться так, что вы забудете подключить IBOutlet
в перо Затем, когда вы пытаетесь сказать объекту сделать что-то в коде во время выполнения, IBOutlet
является nil
и поэтому то, что вы считаете сообщением, отправляемым на ваш объект, на самом деле является nil
, Другими словами, он просто игнорируется и выглядит так, будто не работает.
При условии, что у вас есть (потенциально) допустимая ссылка на объект пользовательского интерфейса, другая распространенная проблема, с которой вы столкнетесь, - это когда разработчик пытается отправить сообщение объекту "слишком рано". В общем, init
методы слишком рано в жизни объекта контроллера, чтобы иметь возможность отправлять сообщения объектам пользовательского интерфейса - те, IBOutlet
все еще nil
, Тем временем -awakeFromNib
называется, IBOutlet
Они должны быть действительными (при условии, что вы подключили их в IB), и затем вы можете отправить сообщение объекту пользовательского интерфейса.
Вы сказали ему использовать потоковую анимацию через -setUsesThreadedAnimation:?