奇怪的NSOutlineView崩溃

时间:2018-10-17 05:26:16

标签: xcode macos cocoa autolayout

我在NSOutlineView中遇到奇怪的崩溃:当我单击“崩溃”按钮时,应用立即崩溃,甚至“异常断点”也无助于查看问题出在哪里。

我尝试在没有调试器的情况下运行应用程序,并重现了问题。应用程序崩溃后,我有了OSX崩溃窗口,并能够从那里提取崩溃消息:

The window has been marked as needing another Update Constraints in Window pass, but it has already had more Update Constraints in Window passes than there are views in the window

也有调用堆栈,但是由于libsystem_c.dylib内部发生崩溃而没有用,所以我不在这里发布。

自动布局似乎出了点问题。完全不知道下一步。请给我一个建议!

还有另外一件事,它仅在更新到OSX Mojave之后才开始。

3 个答案:

答案 0 :(得分:1)

经过数小时的调试和测试,我注意到该消息是由“无限布局循环”引起的。

与大纲视图相关的不同代码导致NSSplitView进行布局。崩溃之前,委托方法- (CGFloat) splitView:(NSSplitView*)sender constrainMinCoordinate:(CGFloat)proposedMinimumPosition ofSubviewAt:(NSInteger)dividerIndex已被调用200次。

很难理解这个bcs,因为它实际上不是无限递归,因此调试器没有太大帮助。 我只是添加了一些简单的代码来帮助我确定问题所在:

static int a = 0; NSLog(@"Layout: %d", a++);

希望我的经验对其他人有帮助!

答案 1 :(得分:0)

我将构建版本更新为IOS 14和Mac OS 20.15.6,该错误消失了。

答案 2 :(得分:-1)

尝试关闭笔尖(在“文件检查器”选项卡中)的“使用自动布局”复选框。 可能必须为每个视图禁用它。

也无关,但是Mojave强迫您使用Core Animation。 我的大多数笔尖都已关闭“设置想要的图层”。 但是,在我的一个笔尖中,我选中了一个杂散的setWantsLayer复选框。 当我取消选中它时,视图(NSSearchField)正确绘制了