我以前从未使用过 NSCoding,我对它应该如何实现感到非常困惑。
我当前的 iPad 应用程序有一个 UIImageView(称为“背景”),它是我的主视图 Controller 的一个属性。 “背景”有一个 UIImage 的“图像”属性(显然)和用户添加的各种 subview 。添加的 subview 是我自己自定义的 UIImageView 子类。
我需要能够保存“背景” UIImageView 的状态,以便可以使用相同的图像和所有 subview 在存档时恢复它。
我了解 UIImageView 符合 NSCoding 协议(protocol),但我不确定在哪里实现 encodeWithCoder 和 initWithCoder。我是否从我的主视图 Controller 调用这些?我是否需要为 UIImageView 创建一个类别以允许我覆盖这些方法?
我是否需要编写代码来归档我的“背景”UIImageView 及其 subview 的每个属性?我在 SO 的其他地方读到 UIImage 不符合 NSCoding,因此需要子类化或添加类别才能存档 UIImageView。
我认为有一种简单的方法可以将一个对象保存到磁盘,包括它的所有属性、 subview 等。似乎需要做很多事情才能让我保存这个“背景”UIImageView 并在以后恢复它。我正在努力想象我需要做的一切。非常感谢任何指针!
最佳答案
序列化(又名归档和取消归档)实际上相当复杂,但 Cocoa 使之变得容易的程度令人印象深刻。
一旦你设置好 UIImageView 和你想要保留的所有属性符合 NSCoding
,那么保存对象所需要做的就是:
NSData *dataToSave = [NSKeyedArchiver archivedDataWithRootObject:yourImageView];
然后将该 NSData 存储在某处。然后,要取消归档对象,
UIImageView *restoredImageView = [NSKeyedUnarchiver unarchiveObjectWithData:dataToRestore];
从某处恢复 NSData 后。
至于让一切都符合 NSCoding,
UIImageView
符合 NSCoding
, UIView
也是如此,所以在您的 UIImageView
之间,它的 subview ,以及它们的属性,一切都可能符合 NSCoding
除了实际的 UIImage
.为此,如果你用谷歌搜索,你可以找到很多人为使其符合 NSCoding
所做的分类。 ,所以只需将其中一个包含在您的项目中,您应该没问题。
关于ios - 使用 NSCoding 归档 UIImageView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9281733/