2011-01-12 6 views
6

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

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

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

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

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

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

ответ

16

решаемого его с помощью:

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

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

+0

Спасибо, много за этот совет, это действительно помогает! – Yojik

+0

Сумасшедший, как долго я искал, чтобы сделать эту работу, спасибо большое! – Jasper

+0

Спасибо, друг! Спасибо, друг! –

0

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

+0

Да, похоже, не помогает. – Henrik

1

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

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

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

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

+0

Хорошие моменты, это объясняет, почему у меня иногда возникали нулевые значения при попытке достичь компонентов выпуска (их слишком рано). Теперь я, казалось, сузил его до задачи рисования.Я сделал его оживленным, когда элемент меню, содержащий вид, подсвечивается (в моем представлении drawRect :), а затем останавливается, когда он больше не подсвечивается. Но если я попытаюсь сделать его анимированным за пределами if-предложения, который проверяет, подсвечен ли элемент, ничего не происходит (все еще внутри drawRect :). – Henrik

+0

Мне удалось заставить его работать несколько больше, кажется, что мне пришлось отправить stopAnimation: раньше, чем сделать startAnimation: work. Но я хочу, чтобы он анимации (или нет), когда отображается меню. В настоящее время мне нужно навести курсор мыши на представление, чтобы он начинался, когда отображается меню, он просто показывает, что индикатор прогресса не анимируется, хотя он должен быть скрыт, когда нет (setDisplayWhenStopped: NO). Продолжение следует в следующем комментарии ... – Henrik

+0

И я все еще не могу заставить его работать при вызове его из-за объекта моего вида, например. перемещаясь по подзонам NSMenu в своем классе контроллера. Похоже, должно быть какое-то событие, когда меню отображается для анимации. – Henrik