簡體   English   中英

NSOpenPanel限制已選擇的文件

[英]NSOpenPanel restrict already selected file

我添加了用於選擇文件夾的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;
    }

這里的文件是具有字符串類型路徑的舊選定文件夾列表

您是否添加了NSLog()調用或使用調試器來查看發生了什么? 再考慮一下在什么情況下需要shouldEnableURL返回YES / NO 例如考慮:

  • 我認為如果files 任何路徑和要檢查的URL滿足某些條件,您都想返回YES 任何建議|| ),但您的邏輯使用&& )。 同樣, 任何建議都建議您可以直接在循環中返回,因為只要files一個路徑滿足您的條件,就無需測試其他路徑。
  • 使用三元條件運算符? : ? :
    • ||相比,此優先級是多少? ,即您的表達式的計算結果是否為(a || b) ? NO : YES (a || b) ? NO : YES或作為a || (b ? NO : YES) a || (b ? NO : YES)
    • 不寫e ? NO : YES e ? NO : YES ,而是使用布爾運算符,如!e

通過考慮上述內容並使用NSLog() /調試器,您應該能夠快速確定返回所需布爾值(無論它是什么)所需的邏輯。

高溫超導

NSOpenSavePanelDelegate的-panel:shouldEnableURL:方法允許您禁用URL,因此無法選擇它們:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM