什么时候在 UIView 或 UIViewController 上调用 "required init?(coder aDecoder: NSCoder)"?
When is "required init?(coder aDecoder: NSCoder)" called on a UIView or UIViewController?
当我使用存储的 属性 创建 UIView
或 UIViewController
的子 class 时,Xcode 将不会编译我的项目,除非我包含一个required init?(coder aDecoder: NSCoder)
的实施。目前,我有以下实现来关闭编译器:
required init?(coder aDecoder: NSCoder) {
fatalError()
}
我明白为什么我需要包含这个初始值设定项;我的 subclass 需要符合 NSCoding
协议,因为它的 superclass 符合它,并且这个初始化器是 NSCoding
协议的一部分,所以它需要和我的一起工作class,即初始化我所有 class 的存储属性(初始化器的超级class 版本不会这样做)。
我想正确的实现应该是这样的:
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 调用,但我的应用程序不会不要使用任何故事板。
如果在故事板场景中使用您的视图实例,将调用此初始化程序。
是否创建功能初始化程序取决于您,但主要是从 init(frame:)
复制代码
当我使用存储的 属性 创建 UIView
或 UIViewController
的子 class 时,Xcode 将不会编译我的项目,除非我包含一个required init?(coder aDecoder: NSCoder)
的实施。目前,我有以下实现来关闭编译器:
required init?(coder aDecoder: NSCoder) {
fatalError()
}
我明白为什么我需要包含这个初始值设定项;我的 subclass 需要符合 NSCoding
协议,因为它的 superclass 符合它,并且这个初始化器是 NSCoding
协议的一部分,所以它需要和我的一起工作class,即初始化我所有 class 的存储属性(初始化器的超级class 版本不会这样做)。
我想正确的实现应该是这样的:
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 调用,但我的应用程序不会不要使用任何故事板。
如果在故事板场景中使用您的视图实例,将调用此初始化程序。
是否创建功能初始化程序取决于您,但主要是从 init(frame:)