当我编写自己的UIButton
- 扩展类并使其成为@IBDesignable
时,我在Interface Builder中收到两个错误,即:
这是我的代码:
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中运行)
答案 0 :(得分:104)
Xcode的Interface Builder要求您为@IBDesignable
类实现 或 初始值设定项,以便在IB中正确呈现。
如果您实施required init(coder aDecoder: NSCoder)
,您还需要覆盖init(frame: CGRect)
,否则“代理会崩溃”,如Xcode抛出的错误所示。
为此,请将以下代码添加到您的班级:
override init(frame: CGRect) {
super.init(frame: frame)
}
答案 1 :(得分:22)
我遇到了同样的问题并以这种方式解决了这个问题:
错误:IB Designables:无法更新自动布局状态:代理崩溃
然后Xcode会告诉你prolem在哪里。
在我的情况下,我在课前放下IBDesignable
。
然后我清理并重建它,错误消失了
答案 2 :(得分:11)
在Xcode 7.3中,上述解决方案都不适用于我,但这个问题的接受答案是:Failed to render instance of IB Designables
- 清除项目的Xcode派生数据。它们位于〜/ Library / Developer / Xcode / DerivedData
中- 按⌘⇧K
清洁当前版本- 构建项目
- 在故事板中,转到“编辑器”菜单并执行“刷新所有视图”;等待构建完成,错误应该消失
醇>
我不需要做第4步来解决问题(并让我的PaintCode-drawRect'd UIView在故事板中绘画),这里包括以防万一。
归功于@Mojtaba和@WeZZard
答案 3 :(得分:9)
有许多问题都可能导致这种情况发生。启动控制台,查找崩溃报告IBDesignablesCocoaTouch...
我刚刚解决了第3方可设计的问题,该问题与valueForKey
语义有关。
答案 4 :(得分:7)
对我而言,它没有使用#if !TARGET_INTERFACE_BUILDER
来帮助我。基本上我有一些代码会导致访问我的Bundle中的路径......
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
)时没有意义在设计时运行。
这是您在故事板中选择Editor -> Debug Selected View
时使用@IBDesignable UIView
时看到的内容:
就我而言,你可以看到initXXXX
正在做一个assert
,它在设计时崩溃,因为它在我的Bundle中寻找文件中的值 - 这是Xcode,at设计时间。
答案 5 :(得分:3)
在任何标记为@IBDesignable的类中使用UIImage时,我发现了一些非常重要的东西。 经典的UIImage init会使代理崩溃:
let myImage = UIImage(named: String) // crash the agent
解决方案是使用UIImage的这个init方法:
let myImage = UIImage(named: String, in: Bundle, compatibleWith: UITraitCollection)
工作代码示例:
let appBundle = Bundle(for: type(of: self))
let myImage = UIImage(named: "myImage", in: bundle, compatibleWith: self.traitCollection))
使用@IBDesignable关键字,self是您的类。 Xcode 9.4,Swift 4.1
答案 6 :(得分:2)
只需在另一个Xcode设置系统上重新打开代码即可。在我的情况下,它工作。
答案 7 :(得分:1)
这就是我解决这个问题的方法:
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
}
}
&#13;
用法:
答案 8 :(得分:0)
答案 9 :(得分:0)
XCode 10,Swift 4.2
我找到了答案here
解决方案很简单-在我的自定义视图类的required init?(coder aDecoder: NSCoder)
方法中更改捆绑的解决方式。
Bundle.main.loadNibNamed(String(describing: TestView.self), owner: self, options: nil)
需要更改为
let bundle = Bundle(for: TestView.self)
bundle.loadNibNamed(String(describing: TestView.self), owner: self, options: nil)