我正在开发沙盒应用程序的新版本,并删除了所有受支持的文件类型(一种除外)。当我运行该应用程序并从文件菜单中选择“打开”时,我只能选择和打开带有我应用程序文件类型扩展名的文件。到目前为止,一切都很好。
现在,我有一个方法可以合并两个我的应用程序文档的内容。在打开一个文档的情况下,我调用NSOpenPanel获取第二个文件。但是,在这种情况下,我得到了意外的行为,即NSOpenPanel允许我选择不在我的应用程序文件类型列表中的文件。但是,它们是早期版本的应用程序可以打开的文件类型。这很奇怪,因为我从info.plist文件中删除了所有的文档类型,但没有一种。
当然,当我选择“禁止”文件时,在下面的代码中返回零。但是我不应该被允许首先选择它。为什么我会出现这种意外行为?
下面打开第二个文件的代码
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel beginSheetModalForWindow:[self window] completionHandler:^(NSInteger returnCode)
{
if (returnCode == NSOKButton) {
NSArray *filesToOpen = [openPanel URLs];
NSURL *absoluteURL = [filesToOpen objectAtIndex:0];
NSDocumentController *docController = [NSDocumentController sharedDocumentController];
[docController openDocumentWithContentsOfURL:absoluteURL
display:NO
completionHandler:^(NSDocument *document,
BOOL documentWasAlreadyOpen,
NSError *error){
// open document code here...
}];
}
}
更新:我的问题来自于不了解CFBundleTypeName和CFBundleTypeExtensions数组之间的区别。我所做的有些令人困惑,但是可以理解。
在新版本中,我将CFBundleTypeName设置为“ X”,并将CFBundleTypeExtensions设置为“ Y”。
在旧版本中,我将CFBundleTypeName设置为“ Z”,并将CFBundleTypeExtensions设置为“ X”。
当NSDocumentController创建NSOpenPanel时,我只能按预期选择扩展名为“ Y”的文件。但是,当我创建NSOpenPanel并将文件类型设置为“ X”时,便可以选择扩展名为“ X”和“ Y”的任何文件。与我认为的两种不同的行为是相同的NSOpenPanel配置。我不知道NSDocumentController是如何配置NSOpenPanel的,所以我无法选择扩展名为“ X”的文件。