[英]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.