NSTextView setNeedsDisplay 在 Mavericks 下不起作用?

Posted

技术标签:

【中文标题】NSTextView setNeedsDisplay 在 Mavericks 下不起作用?【英文标题】:NSTextView setNeedsDisplay not working under Mavericks? 【发布时间】: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上设置需要显示吗? 在这里找到答案:***.com/questions/13916331/… 我需要在主线程上调用 setNeedsDisplay - 它在辅助线程中。奇怪的是,它在 10.7 和 10.8 下似乎总能正常工作。它只在 10.9 下崩溃。 啊,是的,这样就可以了。你没有提到你正在穿线,或者我也会建议。很高兴您找到了解决方案! :) 不如我高兴! :-) 谢谢! 您可能想用实际答案而不是编辑来回答您的问题,然后您可以接受。这样问题就会被标记为已回答,这可以帮助人们看到有解决方案。 【参考方案1】:

您不想在非主线程中对 AppKit 对象进行任何更改——它有时会工作,甚至可能经常工作,但每隔一段时间它就会崩溃,你会想为什么。所以:

[sTextView setTextColor:idleColor range: currentRange];

也需要在主线程上。

【讨论】:

哇,谢谢!我见过崩溃,总是深入一些字形渲染程序。它们很少发生,但如果我通过使程序运行得更快,每秒有很多“事件”来“推动”程序,它们会发生更多。我需要一个单独的线程来运行管理事件列表的紧密循环,以便我的 UI 在主线程上保持响应。这些在 NSTextView 上调用的方法经常发生!所以这引出了一个问题:我是否会看到从主线程“发送”这些方法调用而不是确定何时发送它们的第二个线程会影响性能?不管怎样,我会试试看的。

以上是关于NSTextView setNeedsDisplay 在 Mavericks 下不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

当新的 NSTextView 成为 FirstResponder (MacOS) 时如何移动光标?

NSTextView 的内在内容大小

NSTextView.typingAttributes 接受的键是啥?

NSTextView,附加文本和平滑滚动

更改 NSTextView 中的文本选择颜色

NSTextView 和/或 NSScrollView 的自动调整大小