代码之家  ›  专栏  ›  技术社区  ›  kmell96

什么时候需要“初始化”?(coder aDecoder:NSCoder)“在UIView或UIViewController上调用?

  •  1
  • kmell96  · 技术社区  · 7 年前

    当我创建 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多个自定义视图和视图控制器,在每个自定义视图和视图控制器中正确地实现此功能需要大量的工作。

    所以,我想知道是否有必要正确实现这个初始值设定项,或者我是否可以让它抛出一个致命错误。换句话说, 如果我不在自己的代码中调用这个初始值设定项,它会被调用吗? 我想我读到它可能被情节提要调用,但我的应用程序没有使用任何情节提要。

    1 回复  |  直到 7 年前
        1
  •  5
  •   Paulw11    4 年前

    如果在情节提要场景中使用视图的实例,则将调用此初始化器。

    是否创建一个有效的初始化器取决于您,但主要应该是从 init(frame:)

    推荐文章