@IBDesignable崩溃代理

时间:2015-07-07 10:22:07

标签: ios xcode swift interface-builder

当我编写自己的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()
    }
}

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

10 个答案:

答案 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)

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

  1. 问题:
  2. 错误:IB Designables:无法更新自动布局状态:代理崩溃

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

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

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

答案 2 :(得分:11)

在Xcode 7.3中,上述解决方案都不适用于我,但这个问题的接受答案是:Failed to render instance of IB Designables

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

我不需要做第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时看到的内容:

This is what you see when using the <code>Editor -> Debug Selected View</code> while selecting your <code>@IBDesignable UIView</code> in your storyboard

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

The Debug Navigator

就我而言,你可以看到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)

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

  • 确保插座已正确初始化
  • @IBInspectable属性将被正确初始化
  • 在xib文件中,单击文件的所有者占位符,转到标识检查器,确保它没有任何默认值

&#13;
&#13;
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;
&#13;
&#13;

用法:

enter image description here

答案 8 :(得分:0)

我浪费了整整一天的时间,最后我解决了问题enter image description here

我选择Build for target as 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)