我试图通过序列化和反序列化,使用自定义实例变量来精确复制UIView子类对象。
在复制之前,我给实例变量分配了一个不同于默认值的值。
为什么我要找回实例变量的默认值而不是我分配的默认值?
请参阅下面的演示代码。
谢谢!
class CustomUIView: UIView {
var insVar = 5
}
extension UIView {
func duplicate() -> UIView {
let archive = NSKeyedArchiver.archivedData(withRootObject: self)
return NSKeyedUnarchiver.unarchiveObject(with: archive) as! UIView
}
}
let c1 = CustomUIView()
c1.insVar = 10
let c2 = c1.duplicate() as! CustomUIView
print(c1.insVar) // get 10
print(c2.insVar) // get 5
答案 0 :(得分:0)
NSKeyedArchiver
并不是一种魔术工具,它可以找到类中的所有属性并将其序列化。它调用NSCoding
方法,该方法完成了序列化的艰苦工作。
您尚未覆盖init(coder:)
或encode(with:)
。这就是为什么您的媒体资源未存档的原因。
我不特别推荐这种创建UIView
的精确副本的方法。 UIView
只是显示数据(或模型)的一种方式,因此您可能应该复制数据,然后用新的UIView
显示。您可以编写这样的方法:
func createView(thatDisplays data: SomeType) -> CustomUIView {
// return a new CustomUIView here, configured to display that data...
}
// or as an initialiser:
init(dataToDisplay: SomeType) { ... }
并以此方式创建所有CustomUIView
。然后,您将获得几乎完全相同的视图-唯一的区别在于它显示的数据。将相同的数据传递给此方法与复制UIView
几乎相同,不是吗?