2010-04-21 3 views
0

У меня есть несколько элементов интерфейса Cocoa с выходными соединениями с объектом, созданным в объекте NSView, который в свою очередь помещается NSViewController. Эти элементы, определенный индикатор выполнения и текстовая метка не обновляются: индикатор выполнения мертв и пуст, несмотря на постоянное изменение его значения, текстовая метка не отображается через [textLabel setHidden: NO], текстовая метка не изменяется его строку.Элементы пользовательского интерфейса Cocoa не обновляются

То, что я знаю:

  • Там нет никакой разницы между связывающими значениями и устанавливать их в коде. Ничего не меняется.
  • Я проверил выходные соединения. Они все там.
  • Я пробовал [X displayIfNeeded], где X был самими объектами пользовательского интерфейса, содержащим NSView и основным окном. Нет разницы.
  • [progressBar setUsesThreadedAnimation: YES] не имеет значения. Интересно, что если я посмотрю на progressBar mid-program, _threadedAnimation все еще нет.
  • Объект, содержащий все эти выходы и выполняющий операцию импорта, находится в NSOperationQueue, принадлежащем объекту NSViewController.

Спасибо!

EDIT: Как я уже сказал, я позвонил [self performSelectorOnMainThread: @selector (updateProgress :) withObject: [NSNumber numberWithInt: myObject] waitUntilDone: NO]. (Я также попробовал waitUntilDone: YES.) Он по-прежнему не обновляется. Отладчик четко показывает updateProgress: происходит в основном потоке, поэтому я не знаю, чего не хватает.

ответ

0

Все задачи NSOperation выполняются в отдельных потоках. Вы не можете изменять пользовательский интерфейс из отдельного потока, так как AppKit не является потокобезопасным. Вам нужно будет реорганизовать код так, чтобы все вызовы, которые изменяют интерфейс пользователя выполняется в основном потоке с помощью метода:

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait 
+0

Разве это не ОК, чтобы вызвать селектор, определенный в NSOperation? например, [self performSelectorOnMainThread: @selector (updateProgress :) withObject: myObject waitUntilDone: YES]; Я пытаюсь это сделать, и я не получаю улучшения. У меня был бы этот селектор в моем контроллере приложений, но, ну ... я не знаю, как связать его с этим объектом. : / – spamguy

Смежные вопросы