首页 > 解决方案 > NSOpenPanel 限制已选择的文件

问题描述

我添加了 NSOpenPanel 来选择文件夹。但我想实现以下情况:
1.限制用户选择已经选择的文件夹。
2. 如果父文件夹已经选择,则限制用户选择子文件夹。

或者如果上述情况不可能,那么如何检查当前所选文件夹的父文件夹是否已被选中?

//Panel related code
    aPanel = [NSOpenPanel openPanel];
    [aPanel setMessage:@"Choose folders"];
    [aPanel setPrompt:@"Select"];
    [aPanel setNameFieldLabel:@"Location"];
    [aPanel setAllowsMultipleSelection:YES];
    [aPanel setCanChooseDirectories:YES];
    [aPanel setDirectoryURL:[NSURL fileURLWithPath:NSHomeDirectory()]];
    [aPanel setDelegate:self];
    dispatch_async(dispatch_get_main_queue(), ^
    {
        [aPanel beginSheetModalForWindow:self.view.window completionHandler:^(NSInteger result)
        {
            if (result == NSFileHandlingPanelOKButton)
            {
                for (NSURL *folderPath in [aPanel URLs])
                {
                    [files addObject:[folderPath path]];
                }
            }
        }];
    });

//Filter method handle
    - (BOOL)panel:(id)sender shouldEnableURL:(NSURL *)url {
        BOOL result = YES;
        for (NSString *urlPath in files) {
            result  = result && ( [url.path hasPrefix:urlPath] ||  [urlPath isEqualTo:url.path] ? NO : YES);
        }
        return result;
    }

这里的文件是具有字符串类型路径的旧选定文件夹列表

标签: objective-cmacoscocoansopenpanel

解决方案


您是否添加了NSLog()调用或使用调试器来查看发生了什么?再想想你需要shouldEnableURL返回YES/的条件NO。例如考虑:

  • YES如果其中的任何路径files和正在检查的 URL 满足某些条件,我认为您想要返回。任何建议||),但您的逻辑使用&&)。还有任何建议您可以直接在循环内返回,因为一旦您的条件满足一条路径,files就无需测试其他路径。
  • 三元条件运算符的使用? :
    • 与 相比, this 的优先级是什么||,即您的表达式计算为(a || b) ? NO : YES还是 as a || (b ? NO : YES)
    • 不要写e ? NO : YES,而是使用布尔运算符,如!e

通过考虑上述内容并使用NSLog()/the 调试器,您应该能够快速确定返回所需的布尔值所需的逻辑(无论它是什么)。

高温高压


推荐阅读