从XIB加载视图并在Storyboard中显示

Ale*_*ruk 5 storyboard xib uiview ios swift

在很长一段时间里,我一直在使用xib文件自定义视图.

在这种情况下,我需要做以下事情:

  1. 创建一个具有相同名称的xib-file和swift-file.
  2. 选择视图,将其自定义类设置为swift-file中的类.
  3. 继续工作,并在需要时创建视图,如下所示:

    public extension UIView {
    class func fromXib() -> UIView {
        return NSBundle.mainBundle().loadNibNamed(self.nameOfClass, owner: nil, options: nil).first as! UIView
    }
    
    Run Code Online (Sandbox Code Playgroud)

好的,它有效,没问题.但在不同的项目中,我开始更多地使用Storyboard.我希望在那里显示自定义视图,尽管它们是在xib-file 中设计的(例如,当视图出现在多个屏幕上时,我会这样做).

所以,为了解决这个任务,我做了下一步:

  1. 创建一个具有相同名称的xib-file和swift-file.
  2. 我没有设置自定义类,而是设置File's ownerswift-file的类.(因此UIView默认情况下,我的视图类没有设置).
  3. 我将以下代码添加到视图的生命周期方法中:

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }
    
    func setup() {
        let v = NSBundle(forClass: self.dynamicType).loadNibNamed(self.nameOfClass, owner: self, options: nil).first as? UIView
        addSubview(v!)
        v?.frame = self.bounds
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 我将视图标记为@IBDesignable.

同样,一切都很好,我在故事板的屏幕上添加了一个视图,将它的类设置为我的自定义类,ta-daa,它在Interface Builder中呈现,并在我的应用程序的运行时加载.

问题是:我如何将事物连接在一起?如果我使用我的fromXib方法,应用程序崩溃:Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSObject 0x7f9ea2d5b240> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key hoursLabel.

如果我有办法从两个方面加载视图,那将非常方便.

提前致谢!