Использование 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:?

Другие вопросы по тегам