什么时候在UIView或UIViewController上调用“所需的init?(编码器aDecoder:NSCoder)”?

时间:2018-09-08 21:28:50

标签: ios swift uiview uiviewcontroller nscoding

当我创建带有存储属性的UIViewUIViewController的子类时,除非我包含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调用,但我的应用程序未使用任何故事板。

1 个答案:

答案 0 :(得分:1)

如果在故事板场景或xib文件中使用了视图的实例,则将调用此初始化程序。

由您决定是否创建可运行的初始化程序,但这主要应是从init(frame:)复制代码的问题