6

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

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

4

3 回答 3

13

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

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

  • 将支持读/写的文件类型标记为Editor
  • 将仅导入文件类型标记为Viewer

Class设置为要处理每种文件类型的文档类型。一个文档类可以处理多种文件类型。

在下面的示例中,声明了三种文件类型:font-pestle、otf 和 ttf。第一个,font-pestle,是应用程序的原生格式。此类型具有角色Editor

剩下的两种格式,otf 和 ttf,可以导入但不能由应用程序编写;因此它们被标记为Viewer

示例文档类型

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以返回主要文件类型。

于 2013-04-02T14:16:50.940 回答
4

亚历克斯,感谢您的回答,但我找到了一种我更喜欢的方式:

- (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)
    }
}

这样,仍然可以使用 Cocoa 提供的文档系统来代替我自己的文档系统。

我还在这里记录了解决方案:http: //www.cocoadev.com/index.pl? CFBundleTypeRole 在页面下方。

于 2009-06-16T08:54:36.803 回答
1

我不相信 Cocoa 默认支持导入功能。当用户单击打开面板中的打开按钮时,框架会调用openDocumentWithContentsOfURL:display:error:. NSDocumentController这是文档系统确定您正在打开的文件类型并咨询 Info.plist 文件以确定NSDocument用于打开文档的子类的地方。

您可以子类NSDocumentController化并覆盖该openDocumentWithContentsOfURL:display:error:方法以拦截应导入而不是打开的文件类型。在您的NSDocument子类中,编写一个新的初始化程序,其名称类似于initWithImportedContentsOfURL:type:error:(或具有更好名称的名称 :-) )来创建一个新的无标题文档并读入导入文件的内容。

于 2009-06-11T13:47:12.890 回答