我的应用程序导入了一个文件类型,但没有保存。我已经在文档类型中添加了一个条目并将其设置为只读,但这不会产生我正在寻找的导入行为。相反,我的应用程序将只打开文件,当我保存原始文件时,将以我自己的文件格式覆盖。
如何设置我的文档或文档类型,以便使用原始文档中的数据创建新文档,而不是打开原始文档?
答案 0 :(得分:13)
在Xcode项目中,为应用程序支持的所有文件格式添加文档类型。根据应用程序的能力设置每种类型的角色:
将类设置为您要处理每种文件类型的文档类型。一个文档类可以处理多种文件类型。
在下面的示例中,声明了三种文件类型:font-pestle,otf和ttf。第一个是font-pestle,是应用程序的原生格式。此类型的角色为编辑。
其余两种格式otf和ttf可以导入但不能由应用程序写入;因此它们被标记为查看器。
添加了文档类型后,应用程序将自动允许用户打开指定类型的文件。
您需要将文件类型处理代码添加到文档类中。在理想情况下,将分支代码添加到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
以返回主文件类型。
答案 1 :(得分: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在页面下方。
答案 2 :(得分:1)
我不相信Cocoa默认支持导入功能。当用户单击打开面板中的“打开”按钮时,框架会在openDocumentWithContentsOfURL:display:error:
上调用NSDocumentController
。这是文档系统确定您打开的文件类型的位置,并与Info.plist文件协商以确定用于打开文档的NSDocument
子类。
您可以继承NSDocumentController
并覆盖openDocumentWithContentsOfURL:display:error:
方法来拦截应该导入而不是打开的文件类型。在NSDocument
子类中,编写一个名为initWithImportedContentsOfURL:type:error:
的名称的新初始化程序(或名称更好的东西:-)),以创建新的无标题文档并读入导入文件的内容。 / p>