Xcode - 是否可以在Interface Builder的实时渲染过程(IBDesignable)中调试崩溃?

时间:2014-10-14 18:57:09

标签: ios xcode macos interface-builder

问题

是否可以设置Xcode / Interface Builder的实时渲染执行的断点和调试代码?也就是说,我使用IBDesignable和IBInspectable属性来影响视图,因为它在界面构建器故事板中呈现,并且希望能够调试" IB崩溃"错误。除了prepareForInterfaceBuilder部分之外,我不会在WWDC会话中回想起这个。

上下文

我最近开始看到一些错误报告在尝试渲染我的代码时IB崩溃了。我最终将它追溯到layoutSubviews中的一个无辜的代码行,在我的一个视图中,它是从故事板链接的。 IB在呈现实时视图时的特定问题,在设置所有视图的子视图属性之前称为layoutSubviews(这本身就是一个单独的问题)。这与模拟器和设备形成对比,其中视图是在第一次调用layoutSubviews之前设置的。不过长话短说,它涉及分散一堆文件以找到违规的变化。可以说,如果可以设置断点并捕获崩溃,我本可以快速找到问题。

有没有人想出如何调试和/或通常会捕获这些问题,或者该访问权限尚未可用?

2 个答案:

答案 0 :(得分:35)

我再次观看了WWDC视频(§411@ 22:00左右)。你必须

  • 在IB中编辑视图,并将其自定义类设置为代码库中的类
  • 根据需要在自定义类中设置断点
  • 在IB中选择视图,然后选择编辑器 - > “调试所选视图”(在底部)

奇怪的是,在我今天的测试中,它是通过(initWith)Frame而不是(initWith)Coder创建我的视图。这会导致后续约束配置逻辑失败,因为尚未设置子视图(因为他们会调用'withCoder)。

答案 1 :(得分:5)

(工具说明:Xcode 8.2,macOS Sierra)

我的失败与你的失败截然不同:我的代码崩溃导致Xcode出现IB错误:

  

错误:IB Designables:无法更新自动布局状态:代理崩溃

要在macOS Sierra上进行调试,请打开Console.app,然后打开右侧边栏中的“用户报告”。找到“IBDesignablesCocoaTouch *”崩溃,并选择适用的崩溃。这给了我诊断它所需的代码级信息。

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- not loading resources from bundle in Interface builder