【问题标题】:Can't insert NSAttributedString into NSTextView无法将 NSAttributedString 插入 NSTextView
【发布时间】:2014-08-26 01:22:31
【问题描述】:

以前我可以使用以下代码将属性文本放入 NSTextView 字段

[[self->content textStorage] appendAttributedString:contentString];

但是,在更新到为 Yosemetie 开发的 Xcode 6 Beta 后,以前可以使用的方法现在给我这个错误:

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.

还有一个我认为没有多大用处的更广泛的 gloop。

为了提供有关其工作原理的上下文,用户在字段中输入文本,触发类 InterfaceManager 中名为 GO 的方法,然后运行以下代码以在 @ 中生成一个新线程 ProcessQuery 987654326@ 类,这是我尝试使用属性字符串更改 NSTextView 内容的地方

[NSThread detachNewThreadSelector:@selector(processQuery:) toTarget:self withObject:query];

值得注意的是,如果我通过执行[self->content setString:@"String"]; 来使用标准字符串,则此方法有效,但在使用属性字符串时,它不起作用。

我该如何解决这个问题?

提前致谢! :)

【问题讨论】:

  • 错误很明显,您正在尝试在后台线程上修改布局引擎。您需要在主线程上执行此操作。
  • @Dima 但是这段代码以前可以在 Xcode 5 上运行。此外,我不知道如何将其推送到主线程...
  • 我会在答案中写一些示例代码。

标签: objective-c nsattributedstring nstextview


【解决方案1】:

尝试在主线程上编辑字符串:

dispatch_async(dispatch_get_main_queue(), ^()
{
    [[self->content textStorage] appendAttributedString:contentString];
});

【讨论】:

  • 小心。在不了解周围代码的上下文的情况下,您无法确定异步执行此操作是否安全。例如,如果contentString 是一个可变的属性字符串,并且在对-appendAttributedString: 的原始调用之后发生了变异怎么办?随着您的更改,该突变将与调度竞争。可悲的是,您也不知道使用dispatch_sync() 是安全的,因为它可能会死锁。 :(
  • 不,就事物的同步或异步方式而言,周围的代码并不是超级复杂,这意味着代码工作得非常出色!感谢您的帮助:)
【解决方案2】:

它与 Xcode无关。您明确要求使用[NSThread detachNewThreadSelector] 在后台线程上完成此操作,并且正如 cmets 中所指出的,这是不允许的。您从未被“允许”从后台线程修改 UI,但您通常可以这样做而不会出现明显问题。 Yosemite 可能只是比以前的 OS X 版本更严格地执行此操作。

我想它与setString: 一起工作的原因是因为setString: 可能不会立即调用布局引擎,而是主线程上的下一个绘图通道会这样做。

您要么必须processQuery 分离到后台线程,要么让processQuery 在主线程上调用appendAttributedString,使用类似:

[[self->content textStorage] performSelector:@selector(appendAttributedString:) withObject: contentString]

或将 GCD dispatch_async() 与主线程的队列 @9​​87654329@ 一起使用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多