UIView 的两个构造方法

有时候我们在实现自定义的 UIView 控件的时候,会重写它们的系统构造方法,如下的两个构造方法:

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

required init?(coder: NSCoder){
  super.init(coder: coder)
  fatalError("init(coder:) has not been implemented")
}

这两个方法的区别在于,如果你使用代码传入 frame 布局,则会调用 override init(frame CGRect)

而如果使用 xib/storyboard 则,会调用 required init?(coder: NSCoder)
fatalError("init(coder:) has not been implemented") 这段代码会让程序crash

在所有的 UIView 及其子类在开发中,如果重写了构造方法,就必须要实现 initWithCode 方法,保证提供两种实现方式。因为如果使用 xib 创建 和布局 UIView,它是不会走 initWithFrame 方法的,反正亦然。

class DemoLabel: UILabel {
    
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        fatalError("init(coder:) has not been implemented")
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容