如何将视图层次结构和内容输出到文件?
Posted
技术标签:
【中文标题】如何将视图层次结构和内容输出到文件?【英文标题】:How to output a view hierarchy & contents to file? 【发布时间】:2015-08-22 21:30:30 【问题描述】:我正在编写一个美化的“绘画”应用程序,用户可以在其中粘贴图像,绘制一堆 UIBezier 曲线,然后移动所有这些东西并旋转它们。
其中大部分是通过将 UIImageView 和(子类)UIView 作为子视图堆叠到视图控制器中的主视图上来实现的。
我希望用户能够将其创建状态保存为某种文件并与其他人共享(例如通过 DropBox)。
保存本身不是问题(我知道如何保存文件!),只是将所有信息从应用程序获取到文件然后重新加载的“最佳”方式。
我猜已经有完善的框架可以做到这一点,但奇怪的是,还没有找到任何解决这个问题的方法。
所以,在我开始编写自己的自定义方法来完成这一切之前,我想我会问:
是否有一些推荐的、批准的(甚至可能是“简单的”;-))方式来实现保存(例如写入文件)给定 UIView 的所有子视图的状态?
您对我“尝试做什么”的建议?谢谢。
【问题讨论】:
也许这只是写出任何类的所有内容的一个子案例......我正在阅读有关核心数据、“持久性”的方法以及 NSUserDefaults 等。但它似乎应该是不必要的——当我想要保存的所有“数据”已经很好地存储在 ViewController 层次结构中时,为什么我需要创建一组并行的 NSManagedObjects(如果涉及大图像,这似乎很浪费) ? 【参考方案1】:tl;博士
下降:NSKeyedArchiver.archiveRootObject(view, toFile: "/path/to/archive")
即将推出:let view = NSKeyedUnarchiver.unarchiveObjectWithFile("/path/to/archive")
)
UIView
符合 NSCoding
NSCoding
允许创建archives
,它
提供一种将对象和值转换为独立于体系结构的字节流的方法。
现在我们已经有了拼图的所有部分,让我们把它们放在一起:
我们知道我们需要一个存档器,所以让我们搜索文档,直到找到有希望的内容:
宾果! NSKeyedArchiver
让我们使用这个类将 UIView 序列化为带有archiveRootObject:toFile:
的文件。然后我们将从带有unarchiveObjectWithFile:
的文件中反序列化它。
保存到文件:NSKeyedArchiver.archiveRootObject(view, toFile: "/path/to/archive")
从文件中读取:let view = NSKeyedUnarchiver.unarchiveObjectWithFile("/path/to/archive")
【讨论】:
是的。 (忽略早期关于段错误的 cmets。)我发现对于普通的 UIImageView 对象,您的方法工作得很好,但是如果我完全将 UIImageView 子类化,那么加载回来的内容(在保存和读取之后)只是一个大的黑色矩形(不是正确的图像)没有属性。我已经在各自的 init (coder) 和 encodeWithCode(coder) 方法中实现了 super.init(coder: coder) 和 super.encodeWithCoder(coder),但似乎只有我的自定义属性得到保存和恢复,并且“ super" 属性——例如图像本身——被忽略了。 实际上,这个问题似乎只有在图像存储为“资产”时才会出现。我可以对 UIImageView 进行子类化,例如,如果我从互联网上抓取猫图片,一切正常——即“超级”属性(如图像)得到正确处理并被恢复——但如果我尝试使用我自己的项目“应用程序图像”之一,然后我什么也得不到。我将继续将此问题标记为已回答,因为看来我现在正在处理一个不同的问题。谢谢narohi!以上是关于如何将视图层次结构和内容输出到文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何将视图中的“RenderBody”和“RenderBody”内容作为单独的“标题”和“页脚”文件提供?
UIPageViewController 缓存和交换具有相似内容的页面的视图层次结构