@IBDesignable崩溃代理

当我编写自己的UIButton @IBDesignable类并使其@IBDesignable ,我在Interface Builder中收到两个错误,即:

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

这是我的代码:

 import UIKit @IBDesignable class RandjeUIButton: UIButton { required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.backgroundColor = UIColor.blackColor() } } 

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

Xcode的界面生成器要求你实现@IBDesignable类的两个两个初始化器,以在IB中正确呈现。

如果你实现了required init(coder aDecoder: NSCoder)你也需要重写init(frame: CGRect) ,否则“代理将崩溃”,就像Xcode抛出的错误一样。

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

 override init(frame: CGRect) { super.init(frame: frame) } 

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

  1. 问题:

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

  1. 在检查文件中finddebuggingbutton并点击它。

调试

  1. 然后Xcode会告诉你这个问题在哪里。 在我的情况下,我在IBDesignable前放下IBDesignable

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

在Xcode 7.3中,上述解决scheme都没有为我工作,但是这个问题被接受的答案是: 无法呈现IB Designable的实例

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

我不需要做第四步来解决这个问题(并且让我的PaintCode-drawRect'd UIView在storyboard中绘制),以防万一。

感谢@Mojtaba和@WeZZard

有无数的问题可以导致这一点。 启动控制台,并查找崩溃报告IBDesignablesCocoaTouch...

我刚刚解决了与valueForKey语义有问题的第三方可devise的问题。

只需在另一个Xcode安装系统上重新打开一个代码即可。 在我的情况下,工作。

对我来说,它并没有使用#if !TARGET_INTERFACE_BUILDER#if !TARGET_INTERFACE_BUILDER我。 基本上我有一些代码,将导致访问我的包中的path…

 Bundle.main.path(forResource: "Foo", ofType: "plist") 

问题是,当运行在IB(而不是在你的应用程序), Bundle.main不是你的应用程序…

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

所以对此的回答只是仔细检查你的@IBDesignable UIView代码,并使用#if !TARGET_INTERFACE_BUILDER (在我的情况下调用CoreLocation例如)在devise时运行时没有意义。

我如何debugging和发现这一点

这是您在使用Editor -> Debug Selected View在您的故事板中select@IBDesignable UIViewEditor -> Debug Selected View

这是您在故事板中选择<code> @IBDesignable UIView </ code>时使用<code> Editor  - > Debug Selected View </ code>时看到的内容

然后你会在正确的位置崩溃

调试导航器

就我而言,正如你所看到的, initXXXX正在执行一个assert ,在devise时崩溃了,因为它正在devise时在我的Bundle中find一个值initXXXX

这是我解决这个问题的方法:

  • 确保sockets已正确初始化
  • @IBInspectable属性将被正确初始化
  • 在xib文件中,单击文件的所有者占位符,转到身份检查器,确保它不会有任何默认值
 import UIKit @IBDesignable class TestView: UIView { @IBOutlet weak var label: UILabel! @IBInspectable var textLabel1: String? { get { return label.text } set { label.text = newValue } } // MARK: Setup var view1: UIView! var nibName: String = "TestView" override init(frame: CGRect) { super.init(frame: frame) xibSetup() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) xibSetup() } private func xibSetup() { view1 = loadViewFromNib() view1?.frame = self.bounds view1?.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] if view1 != nil { addSubview(view1!) //textLabel1 = "ok" } } private func loadViewFromNib() -> UIView? { let bundle = NSBundle(forClass: self.dynamicType) let nib = UINib(nibName: nibName, bundle: bundle) for object in nib.instantiateWithOwner(self, options: nil) { if let view: UIView = object as? UIView { return view } } return nil } }