当我创建UIView
或UIViewController
的子类并带有存储属性时,如果我不包含 required init?(coder aDecoder: NSCoder)
的实现,Xcode 将无法编译我的项目。目前,我有以下实现来消除编译器的警告:
required init?(coder aDecoder: NSCoder) {
fatalError()
}
我理解为什么需要包含这个初始化器;我的子类需要遵循NSCoding
协议,因为它的超类遵循该协议,而这个初始化器是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多个自定义视图和视图控制器,正确地在每个自定义视图和视图控制器中实现这个功能是一项很大的工作。
因此,我想知道是否需要正确地实现这个初始化程序,或者是否可以只让它抛出致命错误。换句话说,如果我在自己的代码中不调用它,这个初始化程序会被调用吗?我想我读到过它可能被Storyboard调用,但我的应用程序没有使用任何Storyboard。