我的应用程序导入但未保存一种文件类型。我已向文档类型添加了一个条目并将其设置为只读,但这并没有产生我正在寻找的导入行为。相反,我的应用程序只会打开文件,当我保存时,原始文件会以我自己的文件格式覆盖。

如何设置我的文档或文档类型,以便使用原始文档中的数据创建新文档,而不是打开原始文档?

有帮助吗?

解决方案

1.将文件类型声明为文档类型

在您的 Xcode 项目中,添加 文件类型 适用于您的应用程序支持的所有文件格式。设置 角色 根据您的应用程序的能力,每种类型:

  • 将具有读/写功能的文件类型标记为 编辑;
  • 将仅导入文件类型标记为 观众.

设置 班级 到您想要处理每种文件类型的文档类型。一个文档类可以处理多种文件类型。

在下面的示例中,声明了三种文件类型:字体杵、otf 和 ttf。第一个是 font-pestle,是应用程序的本机格式。这个类型有作用 编辑.

其余两种格式 otf 和 ttf 可以导入,但不能由应用程序写入;因此它们被标记为 观众.

Example Document Types

2.NSDocument 子类中的其他文件类型

添加文档类型后,应用程序将自动允许用户打开指定类型的文件。

您需要将文件类型处理代码添加到文档类中。在理想情况下,将分支代码添加到 readFromData:ofType:error: 方法:

- (BOOL)readFromData:(NSData*)someData ofType:(NSString*)typeName error:(NSError**)outError
{
    if ([NSWorkspace.sharedWorkspace type:@"eu.miln.font-pestle" conformsToType:typeName] == YES)
    {
        // read native format
    }
    else if ([NSWorkspace.sharedWorkspace type:@"public.opentype-font" conformsToType:typeName] == YES)
    {
        // read import only format

        // disassociate document from file; makes document "untitled"
        self.fileURL = nil;
        // associate with primary file type
        self.fileType = @"eu.miln.font-pestle";

    }
    else // ...

}

self.fileURL = nil; 很重要。通过将 fileURL 设置为 nil,您表示该文档不与任何磁盘上的文件关联,应将其视为新文档。

要允许自动保存,请实现 NSDocument 方法 autosavingFileType 返回主要文件类型。

其他提示

亚历克斯,感谢您的答案,但我发现我喜欢多一点的方式:

- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName
               error:(NSError **)outError
{
    *outError = nil;
    if ([typeName isEqualToString:@"SomeReadOnlyType"])
    {
        // .. (load data here)
        [self setFileURL:nil];

        return result;
    }
    else
    {
        // .. (do whatever you do for other documents here)
    }
}

这样,它仍然可以使用由可可提供的文件系统,而不是FO我自己的滚动。

我也记录在这里的解决方案: http://www.cocoadev.com/ index.pl?CFBundleTypeRole 的一点向下的页面。

我不相信,导入功能默认情况下,在可可的支持。当用户点击打开的面板打开按钮,框架调用上openDocumentWithContentsOfURL:display:error: NSDocumentController。这是文件系统计算出推测什么类型你与Info.plist文件打开和咨询文件的外出使用打开文件,其中NSDocument子类。

您可能子类NSDocumentController并重写openDocumentWithContentsOfURL:display:error:方法拦截应导入而不是打开的文件类型。在你NSDocument子类,编写带有initWithImportedContentsOfURL:type:error:(或某事有更好的名字:-))名称的新的初始化,以创建一个新的无标题文档和导入文件的内容读出。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top