gpt4 book ai didi

ios - 什么时候在 UIView 或 UIViewController 上调用 "required init?(coder aDecoder: NSCoder)"?

转载 作者:搜寻专家 更新时间:2023-10-31 22:38:26 27 4
gpt4 key购买 nike

当我使用存储属性创建 UIViewUIViewController 的子类时,除非我包含 required init 的实现,否则 Xcode 不会编译我的项目?(编码器 aDecoder: NSCoder).目前,我有以下实现来关闭编译器:

required init?(coder aDecoder: NSCoder) {
fatalError()
}

我明白为什么我需要包含这个初始化程序;我的子类需要符合 NSCoding 协议(protocol),因为它的父类(super class)符合它,并且这个初始化程序是 NSCoding 协议(protocol)的一部分,所以它需要与我的类一起工作,即初始化我类的所有存储属性(初始化程序的父类(super 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 个自定义 View 和 View Controller ,在每个自定义 View 和 View Controller 中正确实现此功能需要大量工作。

所以,我想知道是否有必要正确地实现这个初始化器,或者我是否可以让它抛出一个 fatal error 。换句话说,如果我不在我自己的代码中调用它,是否会调用它?我想我读到它可能会被 Storyboard调用,但我的应用程序没有使用任何 Storyboard。

最佳答案

如果在 Storyboard 场景中使用 View 实例,将调用此初始化程序。

是否创建一个功能初始化器取决于你,但主要是从 init(frame:)

复制代码

关于ios - 什么时候在 UIView 或 UIViewController 上调用 "required init?(coder aDecoder: NSCoder)"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52239550/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com