NSOpenPanel限制已选择的文件

时间:2018-06-01 13:42:34

标签: objective-c macos cocoa 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;
    }

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

2 个答案:

答案 0 :(得分:2)

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

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

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

HTH

答案 1 :(得分:0)

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

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