当我创建
UIView
或
UIViewController
对于存储属性,Xcode不会编译我的项目,除非我包含
required init?(coder aDecoder: NSCoder)
. 目前,我有以下实现来关闭编译器:
required init?(coder aDecoder: NSCoder) {
fatalError()
}
我理解为什么需要包含这个初始值设定项;我的子类需要符合
NSCoding
因为它的超类符合它,而这个初始值设定项是
因此它需要与我的类一起工作,即初始化我的类的所有存储属性(初始化器的超类版本不会这样做)。
class MyView: UIView {
let label: UILabel
override init(frame: CGRect) {
label = UILabel()
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
if let label = aDecoder.decodeObject() as? UILabel {
self.label = label
} else {
return nil
}
super.init(coder: aDecoder)
}
override func encode(with aCoder: NSCoder) {
aCoder.encode(label)
super.encode(with: aCoder)
}
}
但是,考虑到我的应用程序有50多个自定义视图和视图控制器,在每个自定义视图和视图控制器中正确地实现此功能需要大量的工作。
所以,我想知道是否有必要正确实现这个初始值设定项,或者我是否可以让它抛出一个致命错误。换句话说,
如果我不在自己的代码中调用这个初始值设定项,它会被调用吗?
我想我读到它可能被情节提要调用,但我的应用程序没有使用任何情节提要。