NSOpenPanel 限制已经选择的文件
NSOpenPanel restrict already selected file
我已经为 selecting 文件夹添加了 NSOpenPanel。但我想实现以下情况:
1. 将用户限制为 select 已经 select 编辑的文件夹。
2. 如果父文件夹已经 select,则将用户限制为 select 子文件夹。
或者如果上述情况不可能发生,那么如何检查当前 selected 文件夹的父文件夹是否已经 selected 了?
//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;
}
这里的文件是旧的 selected 文件夹列表具有字符串类型路径
NSOpenSavePanelDelegate 的 -panel:shouldEnableURL: 方法允许您禁用 URL,因此无法选择它们:
https://developer.apple.com/documentation/appkit/nsopensavepaneldelegate/1535200-panel?language=objc
您是否添加了 NSLog()
调用或使用调试器来查看发生了什么?再想想你需要shouldEnableURL
到returnYES
/NO
的条件。例如考虑:
- 我想你想要 return
YES
if any files
和 URL 中的路径被检查满足某种条件。 Any 建议 or (||
) 但你的逻辑使用 and (&&
).此外,any 建议您可以 return 直接在循环内,因为一旦您的条件满足来自 files
的一条路径,则无需测试其他路径。
- 三元条件运算符的使用
? :
- 与
||
相比,它的优先级是什么,即您的表达式是 (a || b) ? NO : YES
还是 a || (b ? NO : YES)
?
- 不要写
e ? NO : YES
,而是使用 not 运算符,如 !e
通过考虑以上内容并使用 NSLog()
/调试器,您应该能够快速确定 return 您需要的布尔值(无论它是什么)所需的逻辑。
HTH
我已经为 selecting 文件夹添加了 NSOpenPanel。但我想实现以下情况:
1. 将用户限制为 select 已经 select 编辑的文件夹。
2. 如果父文件夹已经 select,则将用户限制为 select 子文件夹。
或者如果上述情况不可能发生,那么如何检查当前 selected 文件夹的父文件夹是否已经 selected 了?
//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;
}
这里的文件是旧的 selected 文件夹列表具有字符串类型路径
NSOpenSavePanelDelegate 的 -panel:shouldEnableURL: 方法允许您禁用 URL,因此无法选择它们:
https://developer.apple.com/documentation/appkit/nsopensavepaneldelegate/1535200-panel?language=objc
您是否添加了 NSLog()
调用或使用调试器来查看发生了什么?再想想你需要shouldEnableURL
到returnYES
/NO
的条件。例如考虑:
- 我想你想要 return
YES
if anyfiles
和 URL 中的路径被检查满足某种条件。 Any 建议 or (||
) 但你的逻辑使用 and (&&
).此外,any 建议您可以 return 直接在循环内,因为一旦您的条件满足来自files
的一条路径,则无需测试其他路径。 - 三元条件运算符的使用
? :
- 与
||
相比,它的优先级是什么,即您的表达式是(a || b) ? NO : YES
还是a || (b ? NO : YES)
? - 不要写
e ? NO : YES
,而是使用 not 运算符,如!e
- 与
通过考虑以上内容并使用 NSLog()
/调试器,您应该能够快速确定 return 您需要的布尔值(无论它是什么)所需的逻辑。
HTH