如何在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,你可以;这个话题值得更多的关注。在你的问题中,考虑把这个问题联系起来作为参考。