Элементы пользовательского интерфейса какао не обновляются - PullRequest
0 голосов
/ 22 апреля 2010

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

Что я знаю:

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

Спасибо!

РЕДАКТИРОВАТЬ: Как было предложено, я вызвал [self executeSelectorOnMainThread: @selector (updateProgress :) withObject: [NSNumber numberWithInt: myObject] waitUntilDone: NO]. (Я также пробовал waitUntilDone: ДА.) Он все еще не обновляется. Отладчик четко показывает updateProgress: происходит в основном потоке, поэтому я не знаю, чего не хватает.

1 Ответ

0 голосов
/ 22 апреля 2010

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

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