ios - 使用 NSCoding 归档 UIImageView

标签 ios ipad uiimageview nskeyedarchiver nscoding

我以前从未使用过 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/

相关文章:

ios - 为什么 NSLog 显式地打印出换行符?

iphone - 替换运行时从 XIB 加载的 UIImage 的内容

iphone - 来自 NSData 的图像未正确加载

iphone - 打开项目时 Xcode 4 崩溃

ios - 为分组 TableView 填充 cellForRowAtIndexPath

ios - 一次尝试失败后继续 In try catch in swift

ios - UIButton 图像没有改变

iphone - objective-c - 释放单例属性

iphone - 如何在 UIScrollView 中绘制垂直线

iOS : Drawing on a CGContext eventually blurs