0

我有一些 Cocoa UI 元素,其出口连接到在 NSView 对象中实例化的对象,而该对象又由 NSViewController 放在那里。这些元素,一个明确的进度条和一个文本标签,没有更新:进度条是死的和空的,尽管它的值不断变化,文本标签不会通过 [textLabel setHidden:NO] 取消隐藏,文本标签不会改变它的字符串。

我知道的:

  • 绑定值和在代码中设置它们之间没有区别。两种方式都没有改变。
  • 我检查了插座连接。他们都在那里。
  • 我试过 [X displayIfNeeded],其中 X 是 UI 对象本身、包含 NSView 和主窗口。没有不同。
  • [progressBar setUsesThreadedAnimation:YES] 没有区别。有趣的是,如果我在程序中查看progressBar,_threadedAnimation 仍然是NO。
  • 拥有所有这些出口并执行导入操作的对象位于 NSViewController 对象拥有的 NSOperationQueue 中。

谢谢!

编辑:按照建议,我调用了 [self performSelectorOnMainThread:@selector(updateProgress:) withObject:[NSNumber numberWithInt:myObject] waitUntilDone:NO]。(我也试过 waitUntilDone:YES。)它仍然没有更新。调试器清楚地显示 updateProgress: 发生在主线程中,所以我不知道缺少什么。

4

1 回答 1

0

所有NSOperation任务都在单独的线程中执行。不允许从单独的线程修改 UI,因为 AppKit 不是线程安全的。您将需要重构代码,以便使用以下方法在主线程上执行任何修改用户界面的调用:

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait
于 2010-04-22T00:03:04.777 回答