【发布时间】:2018-09-08 21:28:50
【问题描述】:
当我使用存储属性创建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 个自定义视图和视图控制器,在每个自定义视图和视图控制器中正确实现此功能需要大量工作。
所以,我想知道是否有必要正确实现这个初始化程序,或者我是否可以让它抛出一个致命错误。换句话说,如果我不在自己的代码中调用这个初始化程序,它会被调用吗?我想我读到它可能会被 Storyboard 调用,但我的应用程序不使用任何故事板。
【问题讨论】:
-
如果您的视图实例用于情节提要场景或 xib 文件中,则将调用此初始化程序。
-
@Paulw11,您应该将其发布为答案。
标签: ios swift uiview uiviewcontroller nscoding