NSOpenPanel允许选择包但不显示内容

时间:2012-06-17 12:20:24

标签: objective-c cocoa nsopenpanel

我正在尝试让NSOpenPanel执行以下操作:

  1. 无法选择文件

  2. 可以选择目录和包

  3. 看不到包装内容

  4. 为了得到我需要使用的前两个点:

    [openDlg setCanChooseFiles:NO];
    [openDlg setCanChooseDirectories:YES];
    [openDlg setTreatsFilePackagesAsDirectories:YES];
    

    但是,这意味着在列视图和选择包时,将显示包的内容。我想要有[openDlg setCanChooseFiles:YES]; [openDlg setTreatsFilePackagesAsDirectories:NO];时发生的行为,即可以选择包,但列视图浏览器在选择时不显示内容。

    有什么想法吗?

2 个答案:

答案 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:),并且完全符合我的要求!