在Mac应用程序中导出NSDocument

时间:2013-01-16 13:06:27

标签: macos cocoa nsdocument

如何以一种格式将NSDocument导出为另一种格式的另一种NSDocument

我想在基于文档的应用中实现典型的导出选项。我不确定在哪里放置格式转换代码,以及Cocoa已经提供的内容。

2 个答案:

答案 0 :(得分:7)

NSDocument中的所有写入选项都会获得一个字符串参数来指定应该写入的文件类型。因此,在dataOfType:error:fileWrapperOfType:error:方法中,您应该为要支持的每种文件类型实现转换代码。

要开始导出操作,您可以使用所需类型的方法saveToURL:ofType:forSaveOperation:completionHandler:以及NSSaveToOperation的保存操作。

有关可以覆盖以支持加载和保存文档数据的方法的更多信息,请查看this programming guide

您可以使用writableTypes再次从类方法writableTypesForSaveOperation:或实例方法NSSaveToOperation获取可用类型。

您需要支持的文件类型需要在Info.plist文件中声明。

答案 1 :(得分:1)

如果你的NSDocument子类支持就地自动保存,并且所有可写类型都是可读的(因为它们应该是),我建议使用已经提供的类型转换工作流,用户应该使用“Duplicate”,然后使用“保存”。

在此工作流程中,当用户“复制”文档时,会将其写入/复制到临时文件(保存自动保存的文件)作为无标题文档。当用户关闭文档窗口时,应用程序会建议她保存文档或将其删除。由于文档还没有永久URL,因此NSSavePanel将显示一个附件视图,允许用户选择文档类型。

在此解决方案中,Cocoa已经提供了所有内容,您无需执行任何操作来支持特殊的“导出”功能,因为用户可以使用“复制”,然后使用“保存”。 您只需要根据dataOfType:error:参数(如Sven所说)将文档保存到fileWrapperOfType:error:typeName中的所有可写类型。

这里的优点是用户只有在关闭文件时才选择URL(并选择不删除它) - 并且与基于文档的应用程序中的新工作流兼容,其中“另存为”操作具有已被“复制”替换,后跟“保存”。

请注意,您还必须确保可以复制不可写文档的文档(您可以通过复制原始文件而不是使用writeSafelyToURL:ofType:forSaveOperation:error:来实现此目的。)