swift中使用xib自定义View报错"init(coder:
2019-06-06 本文已影响0人
Flawless_00
一、错误写法
由于刚学习swift,代码习惯偏向OC,使用xib自定义View的时候,将初始化xib的方法写在init的方法里
- 自定义View的类
class xxxView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
_ = Bundle.main.loadNibNamed("xxxView", owner: nil, options: nil)?.first as? xxxView
backgroundColor = UIColor.black.withAlphaComponent(0.3)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
2.控制器中创建
let alert = xxxView.init(frame: CGRect(x: 0, y: 0, width: screenWidth, height: screenHeight))
view.addSubview(alert);
此时运行会报错"init(coder:) has not been implemented"
二、正确写法
class xxxView: UIView {
override func awakeFromNib() {
backgroundColor = UIColor.black.withAlphaComponent(0.3)
}
}
控制器中创建
if let alert = Bundle.main.loadNibNamed("xxxView", owner: nil, options: nil)?.first as? xxxView{
alert.frame = CGRect(x: 0, y: 0, width: screenWidth, height: screenHeight)
view.addSubview(alert);
}
此时运行成功。
三、总结
由于使用的xib创建的View,系统会先调用required init?(coder aDecoder: NSCoder) 方法,再去调用awakeFromNib方法,如果重写init方法,swift会提示required init?(coder aDecoder: NSCoder)这个方法,不写会报错,点击报错红点系统自动创建好这个方法,导致运行报错。
所以在创建xib的自定义View的时候,可以按上面的方法创建。