以前我已经能够使用以下代码将属性文本放入NSTextView字段
[[self->content textStorage] appendAttributedString:contentString];
但是,在更新到Xcode 6 Beta为Yosemetie开发之后,现在的工作现在给了我这个错误:
2014-08-26 11:06:06.635 JaxWire[59482:1765389] An uncaught exception was raised
2014-08-26 11:06:06.636 JaxWire[59482:1765389] Modifications to the layout engine must not be performed from a background thread.
以及我认为没有多大用处的更全面的球形。
要提供有关其工作方式的上下文,用户在字段中输入文本,在类GO
中触发名为InterfaceManager
的方法,然后运行以下代码以生成新线程{{ 1 {}在ProcessQuery
类中,这是我尝试使用属性字符串更改NSTextView的内容
AppDelegate
值得注意的是,如果我通过执行[NSThread detachNewThreadSelector:@selector(processQuery:) toTarget:self withObject:query];
使用标准字符串,但是当使用属性字符串时,它可以正常工作。
我该如何解决此问题?
提前致谢! :)
答案 0 :(得分:1)
尝试编辑主线程上的字符串:
dispatch_async(dispatch_get_main_queue(), ^()
{
[[self->content textStorage] appendAttributedString:contentString];
});
答案 1 :(得分:1)
它与Xcode完全没有没有。您明确要求使用[NSThread detachNewThreadSelector]
在后台线程上完成此操作,并且正如在注释中指出的那样,这是不允许的。您从未被“允许”从后台线程修改UI,但通常您可以这样做而不会出现明显的问题。 Yosemite可能比以前版本的OS X更严格地执行此操作。
我认为它与setString:
一起使用的原因是因为setString:
可能不会立即调用布局引擎,而是主线程上的下一个绘图传递会这样做。
您必须不将processQuery
分离到后台线程,或者使用以下内容在主线程上processQuery
调用appendAttributedString
:
[[self->content textStorage] performSelector:@selector(appendAttributedString:) withObject: contentString]
或将GCD dispatch_async()
与主线程的队列dispatch_get_main_queue()