Objective c NSOpenPanel限制已选择的文件

Objective c NSOpenPanel限制已选择的文件,objective-c,macos,cocoa,nsopenpanel,Objective C,Macos,Cocoa,Nsopenpanel,我添加了用于选择文件夹的NSOpenPanel。但我希望实现以下情况: 1.限制用户选择已选择的文件夹。 2.如果已选择父文件夹,则限制用户选择子文件夹 或者,如果上述情况不可行,则如何检查当前选定文件夹的父文件夹是否已选定 //Panel related code aPanel = [NSOpenPanel openPanel]; [aPanel setMessage:@"Choose folders"]; [aPanel setPrompt:@"Select"];

我添加了用于选择文件夹的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;
    }

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

NSOpenSavePanelDelegate的-panel:shouldEnableURL:method允许您禁用URL,以便无法选择它们:

您是否添加了NSLog调用或使用了调试器来查看发生了什么?再次考虑您需要在哪些条件下返回YES/NO。例如,考虑:

如果文件中的任何路径和正在检查的URL满足某些条件,我认为您希望返回YES。任何建议或| | |但您的逻辑使用和&&。此外,任何建议都建议您可以直接在循环中返回,因为一旦您的条件满足文件中的一条路径,就不需要测试其他路径。 三元条件运算符的使用?: 与| |相比,它的优先级是多少,即表达式的计算结果是否为a | | b?否:是还是a | | b?否:是吗? 不要写e?否:是,改为使用布尔not运算符,如中所示!E 通过考虑上述情况并使用NSLog/调试器,您应该能够快速确定返回所需布尔值所需的逻辑


HTH

我已经尝试过这种方法,但未能实现上述两种情况。我不打算尝试分析该代码是否真的在执行您希望它执行的操作,但显而易见的诊断测试是从-shouldEnableURL:无论如何返回NO。然后,如果所有内容都是灰色的,那么您知道该机制基本上是有效的,并且您可以在自己的代码中跟踪bug。