swift中使用xib自定义View报错"init(coder:) has not been implemented"

一、错误写法

由于刚学习swift,代码习惯偏向OC,使用xib自定义View的时候,将初始化xib的方法写在init的方法里

  1. 自定义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的时候,可以按上面的方法创建。

你可能感兴趣的:(swift中使用xib自定义View报错"init(coder:) has not been implemented")