问题
是否可以设置断点并调试Xcode/InterfaceBuilder的实时渲染执行的代码?也就是说,我正在使用IBDesignable和IBInspectable属性来影响视图,因为它在界面构建器情节提要中呈现,并且希望能够调试"IB崩溃"错误。除了关于prepareForInterfaceBuilder的部分外,我在WWDC会话中记不起这一点。
上下文
我最近开始看到一些错误,报告IB在试图呈现我的代码时崩溃。我最终追踪到了layoutSubviews中一行原本无辜的代码,其中一个视图是从故事板链接而来的。IB在渲染实时视图时遇到的具体问题,在设置视图的所有子视图属性之前称为layoutSubviews(这本身似乎是一个单独的问题)。这与模拟器和设备形成了对比,在模拟器和设备中,视图是在第一次调用layoutSubviews之前设置的。长话短说,它涉及到在一堆文件中寻找冒犯性的更改。可以说,如果可以设置断点并捕获崩溃,我本可以很快找到问题。
有没有人知道如何调试和/或通常捕获这些问题,或者这种访问还不可用?
我又看了一次WWDC视频(§411@22:00左右)。你必须
- 在IB中编辑视图,并将其自定义类设置为代码库中的类
- 根据需要在自定义类中设置断点
- 在IB中选择视图,然后选择编辑器->"调试所选视图"(底部)
奇怪的是,在我今天的测试中,它是通过(initWith)Frame而不是(initWith)Coder来创建我的视图的。这会导致后续约束配置逻辑失败,因为子视图尚未设置(就像调用了"withCoder"一样)。
(工具注释:Xcode 8.2,macOS Sierra)
我的失败与你的完全不同:我的代码崩溃,导致Xcode:中出现IB错误
错误:IB可设计项:无法更新自动布局状态:代理程序导致崩溃
要在macOS Sierra上调试此功能,请打开Console.app,然后在右侧边栏中打开"用户报告"。查找"IBDesignablesCooaTouch*"崩溃,然后选择适用的崩溃。这给了我诊断它所需的代码级别信息。
Crashed Thread: 0
Exception Type: EXC_BAD_INSTRUCTION (SIGILL)
Exception Codes: 0x0000000000000001, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Termination Signal: Illegal instruction: 4
Termination Reason: Namespace SIGNAL, Code 0x4
Terminating Process: exc handler [0]
Application Specific Information:
CoreSimulator 375.21 - Device: IBSimDeviceTypeiPad2x - Runtime: iOS 10.3 (14E8301) - DeviceType: IBSimDeviceTypeiPad2x
Thread 0 Crashed:
0 libswiftUIKit.dylib 0x000000021a2ddead _TToFE5UIKitCSo7UIImagecfT24imageLiteralResourceNameSS_S0_ + 205
1 libswiftUIKit.dylib 0x000000021a2ddcef _TFE5UIKitCSo7UIImageCfT24imageLiteralResourceNameSS_S0_ + 79
2 com.company.App 0x0000000216df74ad _TZFC10App21ControlsP33_F7118662B6663018C7DD0DEBB6FDD87511buttonImagefT8forStateOS_25State_CSo7UIImage + 109 (Controls.swift:121)
…
(在我的情况下,Interface Builder无法加载图像文字。我必须实现此解决方法:xcode 6 IB_DESIGNABLE-不从Interface Builder中的捆绑包加载资源)