如何使用.xib以编程方式创建视图?

时间:2015-08-10 11:36:40

标签: ios swift xib custom-view

我有一个简单的想法 - 假设我们有一个类似于本地通知的单一对象 - 当它被调用时,它应该在当前窗口显示消息视图,无论用户现在在哪里。消息视图包含在.xib中,并获得下一个代码

@IBDesignable class MessageView : UIView {

var view: UIView!

var nibName: String = "MessageView"

@IBOutlet weak var messageLabel: UILabel?
@IBOutlet weak var closeButton: UIButton?

@IBInspectable var message : String? {
    get {
        return messageLabel?.text
    }
    set {
        messageLabel?.text = newValue
    }
}

@IBInspectable var type : MessageType = .Info

// init

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

   setup()
}

required init(coder aDecoder: NSCoder) {
    // properties
    super.init(coder: aDecoder)
   setup()
}

@IBAction func closeButtonTouched(sender: UIButton) {
    self.view.hidden = true
}

func setup() {
    view = loadViewFromNib()

    view.frame = bounds
    view.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight

    addSubview(view)
}

func loadViewFromNib() -> UIView {
    let bundle = NSBundle(forClass: self.dynamicType)
    let view = bundle.loadNibNamed(nibName, owner: nil, options: nil)[0] as! MessageView

    return view
}
}  

当我尝试通过init(frame:)实例化时出现问题。它在运行时与loadNibNamed方法中的下一个文本Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSObject 0x174014ce0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key closeButton.'崩溃。

我应该使用init(frame:)吗?我不明白为什么会出现这个问题。我在教程中做了所有事情,但如果你不以编程方式创建视图,它就可以工作。

以下是有关教程 - https://www.youtube.com/watch?v=r5SKUXSuDOw的其他信息的链接。

3 个答案:

答案 0 :(得分:1)

作为错误状态,您没有在.xib和closeButton之间创建正确的连接,因此这与视图初始化无关。要解决此问题,请打开.xib文件,选择关闭按钮并检查连接检查器中是否缺少连接

答案 1 :(得分:1)

问题在于你的案例中的closeButton截至目前。 closeButton的插座没有与XIB正确连接。

右键单击XIB中的closeButton并将其与班级中的插座连接。 删除文件所有者及其视图的出口。

此错误将得到解决。

答案 2 :(得分:1)

我遇到了类似的问题而且对此感到疯狂。最后,在尝试并检查所有内容之后,唯一有帮助的是重命名.xib文件。