美文网首页
swift中使用xib自定义View报错"init(coder:

swift中使用xib自定义View报错"init(coder:

作者: Flawless_00 | 来源:发表于2019-06-06 19:32 被阅读0次

    一、错误写法

    由于刚学习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:

          本文链接:https://www.haomeiwen.com/subject/voauxctx.html