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

24
问题:

是否有可能在Xcode / Interface Builder的实时渲染中设置断点并调试代码?也就是说,我正在使用IBDesignable和IBInspectable属性来影响在接口构建器的故事板中呈现的视图,并且希望能够调试“IB崩溃”错误。除了prepareForInterfaceBuilder部分之外,我不记得在WWDC会议上有任何内容。

背景:

最近,我开始看到许多错误报告,称在尝试呈现我的代码时IB崩溃了。最终,我将其追溯到布局子视图中与故事板链接的一个无害代码行。具体问题是当渲染实时视图时,IB在设置所有视图子属性之前调用layoutSubviews(这本身似乎是另一个问题)。这与模拟器和设备不同,在那些情况下,视图在第一次调用layoutSubviews之前被设置。长话短说,这涉及对一堆文件进行差异化,以找到有问题的更改。简而言之,如果可以设置断点并捕获崩溃,我可以快速找到问题。

是否有人找出了如何调试和/或通常捕捉这些问题的方法,还是该访问权限尚未可用?

2个回答

37

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

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

奇怪的是,在我的测试中,它通过(initWith)Frame创建我的视图,而不是(initWith)Coder。这会导致随后的约束配置逻辑失败,因为子视图还没有被设置(如果'withCoder'被调用,则已经设置了子视图)。


"这会导致后续的约束配置逻辑失败,因为子视图尚未设置(就像'withCoder被调用一样)。你是如何解决这个问题的?" - Martijn Hols
@MartijnHols:当您使用IBDesignable时,必须完全从initWithFrame(通过辅助函数等)创建视图,不能使用从Xib设置的视图,即使在应用程序中可以使用。这最终对于绘制子视图比布局更好。在我看来,应该通过initWithCoder等方式实现IBDesignable,而不是initWithFrame。 - Chris Conover
谢谢,我不使用Xib,所以那个方法不适用,所有视图都是可用的。当Storyboard崩溃时,我使用原始UIView的“frame”来定位我的子视图,同时对其中一些子视图添加了一些约束。因为Storyboard使用“CGRectZero”初始化UIView,这会破坏一些大小,从而破坏约束(可能最终导致无限循环冻结Storyboard)。最终,我通过删除所有“frame”用法并仅使用约束来解决问题。在代码中有点复杂,但可以解决问题。 - Martijn Hols

9
< p>(工具提示:Xcode 8.2,macOS Sierra)

我的故障与你的完全不同:我在代码中遇到了崩溃,导致在Xcode中出现了IB错误:

error: IB Designables: Failed to update auto layout status: The agent crashed

要在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


这肯定是最顶级的评论之一。太棒了!在最新的Xcode(11)中,我似乎无法使视图调试正常工作,但进入控制台并检查(现在是崩溃报告)真是太好了!谢谢! - Xials

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接