【发布时间】:2013-01-16 13:06:27
【问题描述】:
如何将一种格式的NSDocument 导出为另一种格式的NSDocument?
我想在我的基于文档的应用程序中实现典型的 Export 选项。我不确定我应该把格式转换代码放在哪里,Cocoa已经提供了什么。
【问题讨论】:
标签: macos cocoa nsdocument
如何将一种格式的NSDocument 导出为另一种格式的NSDocument?
我想在我的基于文档的应用程序中实现典型的 Export 选项。我不确定我应该把格式转换代码放在哪里,Cocoa已经提供了什么。
【问题讨论】:
标签: macos cocoa nsdocument
NSDocument中的所有写入选项都获取一个字符串参数来指定应该写入的文件类型。因此,在您的 dataOfType:error: 或 fileWrapperOfType:error: 方法中,您应该为要支持的每种文件类型实现转换代码。
要开始导出操作,您可以使用 saveToURL:ofType:forSaveOperation:completionHandler: 方法和所需的类型以及 NSSaveToOperation 的保存操作。
有关您可以重写以支持加载和保存文档数据的方法的更多信息,请查看this programming guide。
您可以从类方法writableTypes 或实例方法writableTypesForSaveOperation: 中获取可用类型,同样使用NSSaveToOperation。
您想要支持的文件类型需要在您的 Info.plist 文件中声明。
【讨论】:
NSDocument 类应该代表某种文档(文本文档、绘图等),与磁盘文件格式无关。
NSDocument 子类,一个用于文本文件,一个用于绘图。两者都可以支持多种不同的文件格式。
如果您的 NSDocument 子类支持就地自动保存,并且所有可写类型也是可读的(因为它们应该是),我建议使用已经提供的类型转换工作流程,其中用户应该使用“复制”后跟“保存”。
在此工作流程中,当用户“复制”文档时,它会作为无标题文档写入/复制到临时文件(保存自动保存的文件)。当用户关闭文档窗口时,应用程序会建议她保存或删除文档。由于该文档还没有永久 URL,因此会出现一个 NSSavePanel 和一个附件视图,让用户可以选择文档类型。
在此解决方案中,Cocoa 已经提供了所有内容,您无需执行任何操作即可支持特殊的“导出”功能,因为用户可以使用“复制”后跟“保存”。
根据typeName 参数(如Sven 所说),您只需能够将文档保存为dataOfType:error: 或fileWrapperOfType:error: 中的所有可写类型。
这里的优点是用户只有在关闭文件时才需要选择 URL(并且选择不删除它) - 并且与“另存为”操作具有的基于文档的应用程序中的新工作流程兼容被替换为“重复”,然后是“保存”。
请注意,您还必须确保可以复制不可写文档的文档(您可以通过复制原始文件而不是使用 writeSafelyToURL:ofType:forSaveOperation:error: 来实现)。
【讨论】: