无法将NSAttributedString插入NSTextView

时间:2014-08-26 01:22:32

标签: objective-c nsattributedstring nstextview

以前我已经能够使用以下代码将属性文本放入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]; 使用标准字符串,但是当使用属性字符串时,它可以正常工作。

我该如何解决此问题?

提前致谢! :)

2 个答案:

答案 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()

一起使用