@IBDesignable崩溃代理

jbe*_*s94 71 xcode interface-builder ios swift

当我编写自己的UIButton扩展类并创建它时@IBDesignable,我在Interface Builder中收到两个错误,即:

  • Main.storyboard:错误:IB Designables:无法更新自动布局状态:代理程序崩溃,因为fd已关闭
  • Main.storyboard:错误:IB Designables:无法呈现RandjeUIButton的实例:代理程序崩溃

这是我的代码:

import UIKit

@IBDesignable
class RandjeUIButton: UIButton {
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        self.backgroundColor = UIColor.blackColor()
    }
}
Run Code Online (Sandbox Code Playgroud)

我在OS X 10.11 beta 2上使用Xcode 7 beta 2.(在VM中运行)

mat*_*elo 113

Xcode的Interface Builder要求您实现两个两个@IBDesignable类的初始化器不能在IB中正确呈现.

如果你实现required init(coder aDecoder: NSCoder)你也需要覆盖init(frame: CGRect),否则"代理将崩溃",如Xcode抛出的错误所示.

为此,请将以下代码添加到您的类中:

override init(frame: CGRect) {
    super.init(frame: frame)
}
Run Code Online (Sandbox Code Playgroud)

  • 我不这么认为这就是原因.我有两种方法,我在7.2.它仍在崩溃. (12认同)
  • @mathielo我还覆盖了覆盖init(frame:CGRect)和必需的init?(coder aDecoder:NSCoder)方法.仍然有同样的错误 (2认同)

小智 23

我遇到了同样的问题并以这种方式解决了这个问题:

  1. 问题:

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

  1. 在检查文件中找到调试按钮并单击它.

调试

  1. 然后Xcode会告诉你prolem在哪里.在我的情况下,我IBDesignable在课前放弃了.

  2. 然后我清理并重建它,错误消失了

  • 在点击Debug按钮之前不要忘记**创建一个"All Exceptions"断点**,这样调试器会在崩溃后停止一些指令,你可以在堆栈跟踪列表中单击你的代码,或者在导致崩溃的指令处. (2认同)

Gle*_*ett 11

在Xcode 7.3中,上述解决方案都不适用于我,但是这个问题的接受答案是:无法呈现IB Designables的实例

  1. 清除项目的Xcode派生数据.它们位于〜/ Library/Developer/Xcode/DerivedData中
  2. 按⌘⇧K清除当前版本
  3. 建立你的项目
  4. 在故事板中转到"编辑器"菜单并执行"刷新所有视图"; 等待构建完成,错误应该消失

我不需要做第4步来解决问题(并让我的PaintCode-drawRect'd UIView在故事板中绘画),这里包括以防万一.

感谢@Mojtaba和@WeZZard


Stu*_* mc 11

对我来说,没有使用#if !TARGET_INTERFACE_BUILDER它让我.基本上我有一些代码会导致访问我的Bundle中的路径...

Bundle.main.path(forResource: "Foo", ofType: "plist")
Run Code Online (Sandbox Code Playgroud)

问题是,在IB(而不是在您的应用程序中)运行时,Bundle.main不是您的应用程序...

(lldb) po Bundle.main
NSBundle </Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Overlays> (loaded)
Run Code Online (Sandbox Code Playgroud)

所以答案就是@IBDesignable UIView仔细检查你的代码并使用在设计时运行时没有意义的#if !TARGET_INTERFACE_BUILDER任何事情(CoreLocation例如我的调用).

我如何调试并找到了这个

这是Editor -> Debug Selected View@IBDesignable UIView在故事板中使用while时选择的内容:

这是您在故事板中选择<code>initXXXX</code>那样<code>assert</code>,在设计时崩溃,因为它在我的Bundle中寻找文件中的值 - 这是Xcode,在设计时.</p></p>
        <ul class=


voi*_*ref 10

有许多问题可能导致这种情况.启动控制台,查找崩溃报告IBDesignablesCocoaTouch...

我刚刚解决了第三方可设计的问题,这个问题与valueForKey语义有关.


Adr*_*von 7

在任何标有@IBDesignable的类中使用UIImage时,我发现确实很重要。经典的UIImage初始化会使代理崩溃:

let myImage = UIImage(named: String) // crash the agent
Run Code Online (Sandbox Code Playgroud)

解决方案是使用UIImage的此init方法:

let myImage = UIImage(named: String, in: Bundle, compatibleWith: UITraitCollection)
Run Code Online (Sandbox Code Playgroud)

工作代码示例:

let appBundle = Bundle(for: type(of: self))
let myImage = UIImage(named: "myImage", in: bundle, compatibleWith: self.traitCollection))
Run Code Online (Sandbox Code Playgroud)

使用@IBDesignable关键字的self是您的类。Xcode 9.4,Swift 4.1


esc*_*ian 5

XCode 10,Swift 4.2

我在这里找到答案

解决方案很简单-在required init?(coder aDecoder: NSCoder)我的自定义视图类的方法中更改解决捆绑的方式。

    Bundle.main.loadNibNamed(String(describing: TestView.self), owner: self, options: nil)
Run Code Online (Sandbox Code Playgroud)

需要更改为

let bundle = Bundle(for: TestView.self)
bundle.loadNibNamed(String(describing: TestView.self), owner: self, options: nil)
Run Code Online (Sandbox Code Playgroud)