当我们在使用nib进行页面布局的时候,在自定义的View类里面。会对页面进行初始化,和一系列的操作。一般我们通过nib创建的View,我们都会通过loadNibName来进行初始化:
let nib = Bundle.main.loadNibNamed("LoginView", owner: nil, options: nil)
let view = nib?.first as! LoginView
当我们这样去调用这个LoginView的时候,因为我们是使用的nib进行创建的View,所以系统会先调用 init?(coder aDecoder: NSCoder),然后再调用 awakeFromNib()。所以我们在使用nib的时候,只用awakeFromNib()来初始化。如果你是使用了这样的初始化方法:
override init(frame: CGRect) {
super.init(frame: frame)
loginBtn.layer.masksToBounds = true
loginBtn.layer.cornerRadius = 5
loginBtn.layer.borderColor = UIColor.red.cgColor
loginBtn.layer.borderWidth = 1
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
那么就会报错"init(coder:) has not been implemented"。
所以在使用nib进行创建View的时候,我们就要使用如下的初始化方式:
override func awakeFromNib() {
super.awakeFromNib()
loginBtn.layer.masksToBounds = true
loginBtn.layer.cornerRadius = 5
loginBtn.layer.borderColor = UIColor.red.cgColor
loginBtn.layer.borderWidth = 1
}
这样就可以避免这个问题了