@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) }
我遇到了同样的问题,并以这种方式解决它:
- 问题:
错误:IB Designables:无法更新自动布局状态:代理崩溃
- 在检查文件中finddebuggingbutton并点击它。
-
然后Xcode会告诉你这个问题在哪里。 在我的情况下,我在
IBDesignable
前放下IBDesignable
。 -
然后我清理并重build它,错误消失了
在Xcode 7.3中,上述解决scheme都没有为我工作,但是这个问题被接受的答案是: 无法呈现IB Designable的实例
- 清除项目的Xcode派生数据。 它们在〜/ Library / Developer / Xcode / DerivedData中
- 按⌘⇧K清理当前版本
- build立你的项目
- 在故事板中进入编辑器菜单,并执行刷新所有视图; 等待构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 UIView
时Editor -> Debug Selected View
:
然后你会在正确的位置崩溃
就我而言,正如你所看到的, 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 } }