如何实现一个复杂的基于NSDocument的应用程序,导入和导出非本机文件类型?

时间:2016-06-02 05:41:36

标签: macos cocoa nsdocument

我正在开发支持非常复杂操作的应用。它类似于Xcode之类的东西,因为主文档由项目窗口表示,其中包含许多条目。磁盘上的文档是一个包(意思是下面有文件和文件夹结构的目录)。

至少有一种文件类型可以导入和导出( .mfst),但它并不打算直接编辑此文件类型。也就是说,打开此文件类型会导致创建本机文档类型,并将文件的内容导入其中。磁盘上的文件是一个包( .mproj),其中包含许多文件。

从技术上讲,该文件将逐字复制到本机文档包中的正确位置。对该文件中包含的数据的任何更改都将保存到包中的副本中,而不是已导入的副本。

也可以导出该文件类型。

问题1:此应用是导入类型的查看者还是编辑器?我认为它是前者。

问题2: This question支持导入的类型显示了如何通过NSDocument子类实现导入,但似乎可能继承NSDocumentController是一个很好的方法。

这样做的一个原因是,如果用户已经导入.mfst文件,我想抓住这个事实。还有其他文件可能与打开的文档相关,应该导入该文档而不是创建新文档。

问题3:不幸的是,一些在项目上运行的代码要求磁盘上存在某些文件。这意味着即使在响应打开可导入文件类型而创建新文档时,我仍需要继续在磁盘上创建捆绑包并将文件复制到那里以便可以对其进行操作。我想向用户保持一种错觉,即这是一个未命名的未保存文档。这可能吗?

我意识到这违背了Apple"现代"不需要保存的文件概念。也许让所有操作自动保存会更好。我知道我从来没有能够明确保存文档。我现在不确定推荐的用户界面是什么(Apple似乎已经改变了这一点)。

建议欢迎。

1 个答案:

答案 0 :(得分:1)

  1. 此行为听起来像是原始文件的 Viewer ,因为它无法更改文件。

    对于导出的文件类型,请使用Info.plist键值将这些文件添加到应用程序的UTExportedTypeDeclarations文件中。以下是Font Pestle的示例。 Font Pestle不会打开或编辑CSS,但它会导出格式:

     <key>UTExportedTypeDeclarations</key>
         <array>
             <dict>
                <key>UTTypeConformsTo</key>
                <array>
                    <string>public.source-code</string>
                    <string>public.utf8-plain-text</string>
                </array>
                <key>UTTypeDescription</key>
                <string>Cascading Style Sheet</string>
                <key>UTTypeIdentifier</key>
                <string>eu.miln.font-pestle.css</string>
                <key>UTTypeReferenceURL</key>
                <string>http://www.w3.org/Style/CSS/</string>
                <key>UTTypeTagSpecification</key>
                <dict>
                    <key>public.filename-extension</key>
                    <array>
                        <string>css</string>
                    </array>
                </dict>
            </dict>
    
  2. 子类化NSDocumentController是检查以前导入的正在打开的文件副本的合理位置。

    如果您发现自己在NSDocumentController子类中编写了数百行代码,请重新考虑您的设计。所需的子类化应该是最小的。

  3. 使用NSDocumentNSFileWrapper的支持。

    NSFileWrapper旨在帮助简化基于捆绑的管理文档。在用户主动保存或需要为文档选择目标之前,NSDocumentNSFileWrapper将处理保存未记录文档的临时副本。

  4. 我强烈建议您阅读Apple About the Cocoa Document Architecture并尽可能遵循其指南。这将节省您的时间,并且希望随着Apple发展其底层框架,使您的应用程序更容易维护。