2012-02-14 65 views
1

我从来没有使用NSCoding之前,我很困惑它应该如何实现。存档与NSCoding UIImageView

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

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

我知道UIImageView符合NSCoding协议,但我不确定在哪里实现encodeWithCoder和initWithCoder。我从我的主视图控制器调用这些吗?我需要为UIImageView创建一个类别,它允许我重写这些方法吗?

我是否需要编写代码来存档我的“背景”UIImageView及其子视图的每个属性?我已经读过其他地方,因为UIImage不符合NSCoding,因此需要进行子类化或添加一个类别以便能够归档UIImageView。

我认为会有一个简单的方法来保存一个对象,包括它的所有属性,子视图等。看起来有很多事情需要做,以便我保存这个“背景”UIImageView并将其恢复后来。我努力想象我需要做的一切。任何指针非常感谢!

回答

3

序列化(也称为归档和非归档)实际上非常复杂,但Cocoa使其变得容易的程度是一个非常令人印象深刻的壮举。

一旦你设置的东西,从而使的UIImageView和所有要保持其性能符合NSCoding,那么所有你需要做的拯救的对象是:

NSData *dataToSave = [NSKeyedArchiver archivedDataWithRootObject:yourImageView]; 

然后将NSData存储在某处。然后,为了解开对象,在从某处恢复NSData之后,

UIImageView *restoredImageView = [NSKeyedUnarchiver unarchiveObjectWithData:dataToRestore]; 

至于把一切都符合NSCoding,UIImageView符合NSCoding,为您UIImageView,其子视图之间确实UIView,所以,他们的性质,一切都可能符合NSCoding除了实际UIImage。为此,如果你的谷歌你可以找到许多类别,人们已经使其符合NSCoding,所以只需在你的项目中包括其中一个,你应该没问题。