当我创建带有存储属性的UIView
或UIViewController
的子类时,除非我包括required init?(coder aDecoder: NSCoder)
的实现,否则Xcode将不会编译我的项目。当前,我可以通过以下实现关闭编译器:
required init?(coder aDecoder: NSCoder) {
fatalError()
}
我了解为什么需要包含此初始值设定项;我的子类需要符合
NSCoding
协议(protocol),因为其父类(super class)符合该协议(protocol),并且此初始化器是NSCoding
协议(protocol)的一部分,因此它需要与我的类一起使用,即初始化我类的所有存储属性(初始化器的父类(super class)版本)不会)。我认为正确的实现应如下所示:
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多个自定义 View 和 View Controller ,因此在每个自定义 View 和 View Controller 中正确实现此功能是一项繁重的工作。
因此,我想知道是否有必要正确实现此初始化程序,或者是否可以让它引发致命错误。换句话说,如果我未在自己的代码中调用,是否会调用该初始化程序? 我想我读过一个Storyboard可以调用它,但是我的应用程序不使用任何Storyboard。
最佳答案
如果在 Storyboard场景或xib文件中使用了 View 的实例,则将调用此初始化程序。
由您决定是否创建可运行的初始化程序,但这主要取决于复制init(frame:)
中的代码