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")
    }
}

你可能感兴趣的:(UIView 的两个构造方法)