【问题标题】:Cocoa UI Elements Not UpdatingCocoa UI 元素未更新
【发布时间】:2010-04-21 21:45:44
【问题描述】:

我有一些 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: 发生在主线程中,所以我不知道缺少什么。

【问题讨论】:

    标签: cocoa progress-bar nsview


    【解决方案1】:

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

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

    【讨论】:

    • 调用 NSOperation 中定义的选择器不好吗?例如,[self performSelectorOnMainThread:@selector(updateProgress:) withObject:myObject waitUntilDone:YES];我正在尝试这个,我没有得到任何改善。我的应用程序控制器中有这个选择器,但是,嗯......我不知道如何将它链接到这个对象。 ://
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 2019-09-09
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多