3

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

  1. 无法选择文件

  2. 可以选择目录和包

  3. 看不到包裹内容

为了获得前两点,我需要使用:

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

然而,这意味着当在列视图中选择一个包时,会显示包的内容。我想要当我们[openDlg setCanChooseFiles:YES]; [openDlg setTreatsFilePackagesAsDirectories:NO];选择包时发生的行为,但列视图浏览器在选择时不显示内容。

有任何想法吗?

4

2 回答 2

1

NSSavePanel 的委托中有一个现已弃用的方法,其方法名称为:

- (BOOL) panel: (id) sender shouldShowFilename: (NSString *) filename]

可以用来告诉保存面板显示某些文件名。

关于如何使用它的详细信息可以在这个 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;

什么 NSOpenSavePanelDelegatepanel:shouldEnableURL:显然只是允许或禁止选择文件。

为了让您的应用程序适应未来,您可能需要在使用respondsToSelector不太理想的 " " 方法之前确保 " shouldShowFilename" 作为选项仍然可用。shouldEnableURL

于 2012-06-17T12:42:22.283 回答
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:)并且完全符合我的要求!

于 2012-06-17T23:14:59.553 回答