我正在通过在线课程学习 iOS 开发,每次我制作自定义视图(自定义表视图单元格、集合视图单元格等)时,讲师总是实现此初始化程序:
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
为什么我总是必须调用这个?它有什么作用?我可以将属性放入 init 中吗?
我将从相反的方向开始回答:如果您想将视图的状态保存到磁盘怎么办?这被称为序列化。相反的是反序列化- 从磁盘恢复对象的状态。
The NSCoding
协议定义了两种方法来序列化和反序列化对象:
encodeWithCoder(_ aCoder: NSCoder) {
// Serialize your object here
}
init(coder aDecoder: NSCoder) {
// Deserialize your object here
}
那么为什么你的自定义类中需要它呢?答案是界面生成器。当您将对象拖到情节提要上并对其进行配置时,Interface Builder 会将该对象的状态序列化到磁盘上,然后在情节提要出现在屏幕上时对其进行反序列化。您需要告诉 Interface Builder 如何执行这些操作。至少,如果您不向子类添加任何新属性,您可以简单地要求超类为您进行打包和拆包,因此super.init(coder: aDecoder)
称呼。如果你的子类比较复杂,你需要为子类添加你自己的序列化和反序列化代码。
这与 Visual Studio 的方法相反,后者将代码写入隐藏文件以在运行时创建对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)