Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Cocoa中创建仅导入的文档类型?_Cocoa_Document Based - Fatal编程技术网

如何在Cocoa中创建仅导入的文档类型?

如何在Cocoa中创建仅导入的文档类型?,cocoa,document-based,Cocoa,Document Based,有一个文件类型“我的应用程序导入但不保存”。我已经在文档类型中添加了一个条目,并将其设置为只读,但这并没有产生我正在寻找的导入行为。相反,我的应用程序只会打开文件,当我保存原始文件时,它会以我自己的文件格式覆盖 如何设置我的文档或文档类型,以便使用原始文档中的数据创建新文档,而不是打开原始文档?我认为Cocoa中默认不支持导入功能。当用户单击“打开”面板中的“打开”按钮时,框架将在NSDocumentController上调用openDocumentWithContentsOfURL:displ

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


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

我认为Cocoa中默认不支持导入功能。当用户单击“打开”面板中的“打开”按钮时,框架将在
NSDocumentController
上调用
openDocumentWithContentsOfURL:display:error:
。在这里,文档系统会确定您要打开的文件类型,并参考Info.plist文件确定用于打开文档的
NSDocument
子类


您可以将
NSDocumentController
子类化,并使用contentsofURL:display:error:方法覆盖
opendocument,以截取应该导入而不是打开的文件类型。在您的
NSDocument
子类中,编写一个名为
initWithImportedContentsOfURL:type:error:
(或更好的名称:-)的新初始值设定项,以创建一个新的无标题文档并读取导入文件的内容。

Alex,谢谢您的回答,但我找到了一种我更喜欢的方法:

- (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提供的文档系统,而不是我自己的

我在这里也记录了解决方案:稍微向下一点。

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

  • 将可读/写的文件类型标记为编辑器
  • 将仅导入文件类型标记为查看器
类设置为要处理每种文件类型的文档类型。一个文档类可以处理多种文件类型

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

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

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

如果您的应用程序也可以导出导入的类型,该怎么办?那还被认为是“观众”吗?@Rick,你可以;这个话题值得更多的关注。在你的问题中,考虑把这个问题联系起来作为参考。