【问题标题】:Xcode - is it possible to debug crashes in the Interface Builder's Live Rendering process (IBDesignable)?Xcode - 是否可以在 Interface Builder 的实时渲染过程 (IBDesignable) 中调试崩溃?
【发布时间】:2014-12-09 16:29:19
【问题描述】:

问题

Xcode/Interface Builder 的 Live Rendering 可以设置断点和调试代码吗?也就是说,我使用 IBDesignable 和 IBInspectable 属性来影响视图,因为它在界面构建器故事板中呈现,并且希望能够调试“IB 崩溃”错误。除了 prepareForInterfaceBuilder 部分之外,我不记得在 WWDC 会议上的这一点。

上下文

我最近开始看到一些错误,报告说 IB 在尝试呈现我的代码时崩溃了。我最终在我的一个从情节提要链接的视图中将其追溯到 layoutSubviews 中原本无辜的代码行。 IB 的具体问题 - 在渲染实时视图时,在设置所有视图的子视图属性之前称为 layoutSubviews(这本身似乎是一个单独的问题)。这与模拟器和设备形成对比,其中视图是在第一次调用 layoutSubviews 之前设置的。长话短说,它涉及对一堆文件进行比较以找到有问题的更改。可以说,如果可以设置断点并捕获崩溃,我可以很快找到问题。

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

【问题讨论】:

    标签: ios xcode macos interface-builder


    【解决方案1】:

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

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

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

    【讨论】:

    • “这会导致后续约束配置逻辑失败,因为子视图尚未设置(因为它们会调用 'withCoder)。”你是怎么解决的?
    • @MartijnHols:当您使用 IBDesignable 时,您必须完全从 initWithFrame(通过辅助函数等)创建视图,您不能使用从 Xib 设置的视图,即使它在应用程序中工作。它最终更适合绘制子视图,然后布置更大的视图。在我看来,IBDesignable 应该通过 initWithCoder 等来实现,而不是 initWithFrame。
    • 谢谢,我不使用 Xib,所以这不适用,所有视图都可用。我在故事板崩溃时所做的是使用原始 UIView 的 frame 来定位我的子视图,同时还为其中一些子视图添加一些约束。因为情节提要使用CGRectZero 初始化 UIView,所以这弄乱了一些尺寸,进而打破了约束(可能最终导致冻结情节提要的无限循环)。我最终通过删除所有 frame 用法并仅使用约束来解决我的问题。代码有点复杂,但解决了这个问题。
    【解决方案2】:

    (工具说明: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

    【讨论】:

    • 这肯定是顶级 cmets 之一。惊人的!在最新的 Xcode (11) 中,我似乎根本无法让视图调试工作,但是进入控制台并检查(现在是崩溃报告)是黄金!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2022-11-28
    • 1970-01-01
    • 2012-09-16
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多