【发布时间】:2014-01-28 03:01:44
【问题描述】:
我的 MacOS Cocoa 应用程序显示一个静态文本窗口,这意味着它不应该由用户更改,不应该是第一响应者等等。文本发生的唯一事情是它的每个单词都会在特定时间点改变颜色(从“idleColor”到“highlightColor”,然后再变回来)。它类似于卡拉 OK 显示 - 单个单词会根据定时事件列表在程序控制下改变颜色,然后再变回来。
所有这些都可以在 MacOS 10.7 和 10.8 下完美运行。但是,在 10.9 下,除非我在窗口中单击并不断移动光标,否则文本颜色不会改变,因此我不断地手动突出显示(和取消突出显示)某些文本。如果我这样做,则常规单词会按预期运行。从本质上讲,感觉就像操作系统拒绝在程序控制下更新窗口,除非我通过手动执行需要 UI 响应的操作来强制它更新。
执行颜色变化的代码如下:
if (sEvent.attribute == HIGHLIGHT_ON) {
[sTextView setTextColor:highlightColor range: currentRange];
textIsLitUp = YES;
}
else {
[sTextView setTextColor:idleColor range: currentRange];
textIsLitUp = NO;
}
[sTextView setNeedsDisplay:YES];
(sTextView 是 NSTextView 的子类。)
现在,如果我注释掉最后一行,那么我会在 10.7 和 10.8 下得到相同的错误行为。换句话说,在 10.9 下,setNeedsDisplay 方法不工作,或者工作方式不同。
有没有人对解决这个问题有任何想法,或者有任何其他问题可以解决这个问题?还是我做错了什么?对应用程序而言,对 textColor 的更改没有延迟是至关重要的!
编辑我的问题 - 回答它:
在这里其他地方找到了答案!我需要在主线程上调用 setNeedsDisplay - 它在辅助线程中。奇怪的是,它在 10.7 和 10.8 下似乎总能正常工作。它仅跌破10.9。所以我只是改变了这个:
[myTextField setNeedsDisplay:YES];
到这里:
dispatch_async(dispatch_get_main_queue(), ^{[myTextField setNeedsDisplay:YES];});
……它似乎奏效了。希望这对其他人有帮助……
【问题讨论】:
-
你试过在sTextView的superview上设置需要显示吗?
-
在这里找到答案:stackoverflow.com/questions/13916331/… 我需要在主线程上调用 setNeedsDisplay - 它在辅助线程中。奇怪的是,它在 10.7 和 10.8 下似乎总能正常工作。它只在 10.9 下崩溃。
-
啊,是的,这样就可以了。你没有提到你正在穿线,或者我也会建议。很高兴您找到了解决方案! :)
-
不如我高兴! :-) 谢谢!
-
您可能想用实际答案而不是编辑来回答您的问题,然后您可以接受。这样问题就会被标记为已回答,这可以帮助人们看到有解决方案。
标签: cocoa osx-mavericks nstextview setneedsdisplay