有时候我们在实现自定义的 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")
}
}