我有一个Objective-C macOS应用程序,该应用程序的窗口的左侧基本上是NSTableView
,右侧的详细信息视图是NSSplitView
。该窗口还具有标签和其他控件。一些元素由绑定驱动,另一些则通过引用出口驱动。一旦我打开窗口,如果我什么都没触摸,它就会起作用。如果在打开窗口后立即用鼠标在窗口的任何部分上快速滚动,则堆栈跟踪会崩溃:
以及日志中令人讨厌的“意外的未完成的后台CATransaction”错误。我知道这种情况几乎总是由于后台线程中的UI更新引起的,但是我要在无数小时内检查我的代码,并且找不到在后台完成的UI的单个更新。最奇怪的是,崩溃仅在通过Xcode运行应用程序时发生。如果我从Finder运行该应用程序,它将永远不会发生。 NSTableView是通过数据源和委托来驱动的,我试图删除连接,但这种情况仍然发生。我试图在WindowDidLoad中使用return语句排除部分代码,但是仍然会发生。同样,删除绑定并不能解决问题。有人可以建议一种强大的技术来找出导致崩溃的指令吗?
编辑:
我已从NSWindowController
的窗口中删除了所有对象,只将NSScrollView
嵌入了NSTableView
。即使我从numberOfRowsInTableView
手动返回0,它仍然会发生。我有一个可能的提示,可能会导致解决方案:如果将NSTableView
设置为未启用或隐藏,或者同时设置了两者,则仍然会发生。如果将NSScrollView
设置为隐藏,则不会再发生这种情况。我希望这能为某人敲响钟声,因为我真的没有策略。再次感谢。
答案 0 :(得分:0)
在使用NSScrollView
和NSSplitView
滚动长视图时,我遇到了同样的问题,我通过使用NSScrollView
的子类解决了这个问题。无需在此子类中添加任何代码。我不知道原因,但是可以。
答案 1 :(得分:0)
这是因为您正在后台线程中运行一些UI更新。您可以通过在主线程而不是后台线程中正确更新UI来解决此问题。
确定显示错误消息的位置,然后将其放入
Dispatchqueue.main.async