当我使用存储的属性创建UIView或UIViewController的子类时,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多个自定义视图和视图控制器,在每个自定义视图和视图控制器中正确地实现此功能是一项艰巨的工作。
所以,我想知道是否有必要正确地实现这个初始化程序,或者是否可以让它抛出一个致命的错误。换句话说,如果我没有在我自己的代码中调用这个初始化器,会被调用吗?我想我读到它可能会被一个故事板调用,但是我的应用程序不使用任何故事板。
发布于 2018-09-08 21:37:55
如果在故事板场景中使用视图的实例,则将调用此初始化器。
这取决于您是否创建一个有效的初始化程序,但这主要应该是从init(frame:)复制代码的问题。
发布于 2022-09-13 13:17:50
它提供一个NSCoder实例作为参数,只有在使用iOS序列化API时才需要该参数。这不是经常使用的,所以你可以忽略它。如果您很想了解,序列化可以转换一个字节流中的对象,您可以将其保存在磁盘上或通过网络发送。
在视图控制器无效化期间,通常会分配视图控制器在其生存期内所需的资源。因此,这包括模型对象或其他辅助控制器,如网络控制器。

https://stackoverflow.com/questions/52239550
复制相似问题