Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 什么时候是;所需初始化?(编码员-编码员:NSCoder)";在UIView或UIViewController上调用?_Ios_Swift_Uiview_Uiviewcontroller_Nscoding - Fatal编程技术网

Ios 什么时候是;所需初始化?(编码员-编码员:NSCoder)";在UIView或UIViewController上调用?

Ios 什么时候是;所需初始化?(编码员-编码员:NSCoder)";在UIView或UIViewController上调用?,ios,swift,uiview,uiviewcontroller,nscoding,Ios,Swift,Uiview,Uiviewcontroller,Nscoding,当我使用存储属性创建UIView或UIViewController的子类时,除非我包含required init?(coder-aDecoder:NSCoder)的实现,否则Xcode不会编译我的项目。目前,我有以下实现来关闭编译器: required init?(coder aDecoder: NSCoder) { fatalError() } 我理解为什么我需要包括这个初始值设定项;我的子类需要符合NSCoding协议,因为它的超类符合它,而此初始值设定项是NSCoding协议的一

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


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

如果在故事板场景中使用了视图的实例,则会调用此初始值设定项


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

复制代码。如果在故事板场景或xib文件中使用了视图的实例,则将调用此初始化器。@Paulw11,您应该将其作为答案发布。确定。作为后续,如果我选择不创建一个功能正常的初始值设定项,有没有比抛出致命错误更好的方法来标记它?也就是说,如果有人试图从代码而不是运行时错误调用它,则会导致编译器错误的一种标记方法?不,您可以调用致命错误,也可以返回
nil
,因为它是一个可失败的初始化器。NSCoder不是仅用于情节提要吗?我从未见过与XIB一起使用它。