我添加了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;
}
此处文件是具有字符串类型路径的旧选择文件夹列表
答案 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