1

我以前从未使用过 NSCoding,我对它应该如何实现感到非常困惑。

我当前的 iPad 应用程序有一个 UIImageView(称为“背景”),它是我的主视图控制器的一个属性。“背景”有一个 UIImage 的“图像”属性(显然)和用户添加的各种子视图。添加的子视图是我自己自定义的 UIImageView 子类。

我需要能够保存“背景” UIImageView 的状态,以便可以使用相同的图像和所有子视图在存档时恢复它。

我了解 UIImageView 符合 NSCoding 协议,但我不确定在哪里实现 encodeWithCoder 和 initWithCoder。我是否从我的主视图控制器调用这些?我是否需要为 UIImageView 创建一个类别以允许我覆盖这些方法?

我是否需要编写代码来归档我的“背景”UIImageView 及其子视图的每个属性?我在 SO 的其他地方读到 UIImage 不符合 NSCoding,因此需要子类化或添加类别才能存档 UIImageView。

我认为有一种简单的方法可以将包括其所有属性、子视图等的对象保存到磁盘。似乎需要做很多事情才能让我保存这个“背景”UIImageView 并在以后恢复它。我正在努力想象我需要做的一切。非常感谢任何指针!

4

1 回答 1

4

序列化(又名归档和取消归档)实际上非常复杂,但 Cocoa 使之变得简单的程度令人印象深刻。

一旦设置好 UIImageView 及其所有要保持的属性,NSCoding那么保存对象所需要做的就是:

NSData *dataToSave = [NSKeyedArchiver archivedDataWithRootObject:yourImageView];

然后将该 NSData 存储在某处。然后,要取消归档对象,

UIImageView *restoredImageView = [NSKeyedUnarchiver unarchiveObjectWithData:dataToRestore];

从某处恢复 NSData 后。

至于使一切都符合 NSCoding,UIImageView符合NSCoding,就像UIView在你的UIImageView、它的子视图和它们的属性之间一样,一切都可能符合NSCoding除了实际的UIImage. 为此,如果您在 google 上搜索,您会发现人们为使其符合标准而制作的许多类别NSCoding,因此只需将其中一个包含在您的项目中,您应该没问题。

于 2012-02-14T18:27:34.393 回答