何时在UIView或UIViewController上调用“required init?(coder aDecoder:NSCoder)”?

问题描述 投票:1回答:1

当我使用存储属性创建UIViewUIViewController的子类时,Xcode将不会编译我的项目,除非我包含required init?(coder aDecoder: NSCoder)的实现。目前,我有以下实现来关闭编译器:

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个自定义视图和视图控制器,在每个自定义视图和视图控制器中正确实现此功能是很多工作。

所以,我想知道是否有必要正确实现这个初始化程序,或者我是否可以让它抛出一个致命的错误。换句话说,如果我不在我自己的代码中调用它,是否会调用此初始化程序?我想我读过它可能被一个故事板调用,但我的应用程序不使用任何故事板。

ios swift uiview uiviewcontroller nscoding
1个回答
1
投票

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

是否要创建一个正常运行的初始化程序取决于你,但它应该主要是从init(frame:)复制代码的问题

© www.soinside.com 2019 - 2024. All rights reserved.