objective-c - 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;
}
这里的文件是具有字符串类型路径的旧选定文件夹列表
解决方案
您是否添加了NSLog()
调用或使用调试器来查看发生了什么?再想想你需要shouldEnableURL
返回YES
/的条件NO
。例如考虑:
YES
如果其中的任何路径files
和正在检查的 URL 满足某些条件,我认为您想要返回。任何建议或(||
),但您的逻辑使用和(&&
)。还有任何建议您可以直接在循环内返回,因为一旦您的条件满足一条路径,files
就无需测试其他路径。- 三元条件运算符的使用
? :
- 与 相比, this 的优先级是什么
||
,即您的表达式计算为(a || b) ? NO : YES
还是 asa || (b ? NO : YES)
? - 不要写
e ? NO : YES
,而是使用布尔非运算符,如!e
- 与 相比, this 的优先级是什么
通过考虑上述内容并使用NSLog()
/the 调试器,您应该能够快速确定返回所需的布尔值所需的逻辑(无论它是什么)。
高温高压
推荐阅读
- google-analytics - bigquery 中复制的“紧随其后”段,适用于会话但不适用于用户?
- reactjs - 缺少“timing”类型命中的必填字段“timingCategory”和“timingVar” - Google Analytics [redux-beacon]
- database - 在 knexjs 中使用事务
- python - 如何使用 python 读取 Cacti RRD 文件并将其保存到 CSV 文件
- reactjs - OnClick 未在路由器中的功能组件上触发
- java - 未注入 jUnit 测试的 Bean
- amazon-web-services - 我不能在 AWS ECS Fargate 中运行超过 5 个任务
- html - 如何将html页面转换为具有asp.net中所有样式的pdf
- python-3.x - 从.exe重定向输出文本,直到使用python关闭exe
- csv - Pyspark:将数据帧保存为csv文件时编码中文字符