我正在尝试让NSOpenPanel执行以下操作:
无法选择文件
可以选择目录和包
看不到包装内容
为了得到我需要使用的前两个点:
[openDlg setCanChooseFiles:NO];
[openDlg setCanChooseDirectories:YES];
[openDlg setTreatsFilePackagesAsDirectories:YES];
但是,这意味着在列视图和选择包时,将显示包的内容。我想要有[openDlg setCanChooseFiles:YES]; [openDlg setTreatsFilePackagesAsDirectories:NO];
时发生的行为,即可以选择包,但列视图浏览器在选择时不显示内容。
有什么想法吗?
答案 0 :(得分:1)
在NSSavePanel的委托中有一个现已弃用的方法,方法名称为:
- (BOOL) panel: (id) sender shouldShowFilename: (NSString *) filename]
可用于告知保存面板 不 显示某些文件名。
有关如何使用它的详细信息可以在this Apple QA technote中看到,它详细说明了如何与您尝试的完全相反(他们的示例是如何选择任何文件但忽略包,但您可以能够翻转内部逻辑。)
现在,请记住,我说该方法已被“弃用”。 NSSavePanel头文件说明了这一点:
/* This method is deprecated in 10.6, and will be formally deprecated */
/* in a future release. Use panel:shouldEnableURL: instead */
- (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename;
NSOpenSavePanelDelegate的panel:shouldEnableURL:
显然只是允许或禁止文件可选。
为了面向未来的应用,您可能需要执行respondsToSelector
trick以确保在使用不太理想的“shouldShowFilename
”方法之前,“shouldEnableURL
”仍然可用作选项
答案 1 :(得分:0)
我实现了NSOpenPanelDelegate方法panel:shouldEnableURL:
,如下所示:
- (BOOL)panel:(id)sender shouldEnableURL:(NSURL *)url {
BOOL showObject = NO;
// This checks if the path is a directory
[[NSFileManager defaultManager] fileExistsAtPath:[url path] isDirectory:&showObject];
// This checks if the path is a package
if ([[NSWorkspace sharedWorkspace] isFilePackageAtPath:[url path]]) {
showObject = YES;
}
return showObject;
}
这不需要任何进一步的配置(如setCanChooseDirectories:
),并且完全符合我的要求!