NSOpenPanel 限制已经选择的文件

NSOpenPanel restrict already selected file

我已经为 selecting 文件夹添加了 NSOpenPanel。但我想实现以下情况:
1. 将用户限制为 select 已经 select 编辑的文件夹。
2. 如果父文件夹已经 select,则将用户限制为 select 子文件夹。

或者如果上述情况不可能发生,那么如何检查当前 selected 文件夹的父文件夹是否已经 selected 了?

//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;
    }

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

NSOpenSavePanelDelegate 的 -panel:shouldEnableURL: 方法允许您禁用 URL,因此无法选择它们:

https://developer.apple.com/documentation/appkit/nsopensavepaneldelegate/1535200-panel?language=objc

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

  • 我想你想要 return YES if any files 和 URL 中的路径被检查满足某种条件。 Any 建议 or (||) 但你的逻辑使用 and (&&).此外,any 建议您可以 return 直接在循环内,因为一旦您的条件满足来自 files 的一条路径,则无需测试其他路径。
  • 三元条件运算符的使用? :
    • || 相比,它的优先级是什么,即您的表达式是 (a || b) ? NO : YES 还是 a || (b ? NO : YES)
    • 不要写 e ? NO : YES,而是使用 not 运算符,如 !e

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

HTH