在我的macOS App中,出现讨厌的“意外的突出背景CATransaction”错误和崩溃,但仅当从Xcode运行时

时间:2019-06-21 07:42:30

标签: objective-c macos cocoa cocoa-bindings

我有一个Objective-C macOS应用程序,该应用程序的窗口的左侧基本上是NSTableView,右侧的详细信息视图是NSSplitView。该窗口还具有标签和其他控件。一些元素由绑定驱动,另一些则通过引用出口驱动。一旦我打开窗口,如果我什么都没触摸,它就会起作用。如果在打开窗口后立即用鼠标在窗口的任何部分上快速滚动,则堆栈跟踪会崩溃:

enter image description here

以及日志中令人讨厌的“意外的未完成的后台CATransaction”错误。我知道这种情况几乎总是由于后台线程中的UI更新引起的,但是我要在无数小时内检查我的代码,并且找不到在后台完成的UI的单个更新。最奇怪的是,崩溃仅在通过Xcode运行应用程序时发生。如果我从Finder运行该应用程序,它将永远不会发生。 NSTableView是通过数据源和委托来驱动的,我试图删除连接,但这种情况仍然发生。我试图在WindowDidLoad中使用return语句排除部分代码,但是仍然会发生。同样,删除绑定并不能解决问题。有人可以建议一种强大的技术来找出导致崩溃的指令吗?

编辑:

我已从NSWindowController的窗口中删除了所有对象,只将NSScrollView嵌入了NSTableView。即使我从numberOfRowsInTableView手动返回0,它仍然会发生。我有一个可能的提示,可能会导致解决方案:如果将NSTableView设置为未启用或隐藏,或者同时设置了两者,则仍然会发生。如果将NSScrollView设置为隐藏,则不会再发生这种情况。我希望这能为某人敲响钟声,因为我真的没有策略。再次感谢。

2 个答案:

答案 0 :(得分:0)

在使用NSScrollViewNSSplitView滚动长视图时,我遇到了同样的问题,我通过使用NSScrollView的子类解决了这个问题。无需在此子类中添加任何代码。我不知道原因,但是可以。

答案 1 :(得分:0)

这是因为您正在后台线程中运行一些UI更新。您可以通过在主线程而不是后台线程中正确更新UI来解决此问题。

确定显示错误消息的位置,然后将其放入

Dispatchqueue.main.async