Swift 5中NSOpenPanel如何仅显示.txt文件?
问题:NSOpenPanel仅显示.txt文件(替代废弃的allowedFileTypes)
在Swift 5中使用NSOpenPanel选择.txt文件时,尝试了三种基于allowedContentTypes的方法,仍会显示.csv、.json、.py等其他文本文件。已知allowedFileTypes可以实现需求,但该API已在macOS 12.0中废弃,请问如何仅显示.txt文件?
尝试过的三种代码:
let dialog = NSOpenPanel(); // 1 dialog.allowedContentTypes = [.text] // 2 let txtType2 = UTType(filenameExtension: "txt") dialog.allowedContentTypes = [txtType2!] // 3 let txtType3 = UTType.types(tag: "txt", tagClass: UTTagClass.filenameExtension, conformingTo: nil) dialog.allowedContentTypes = txtType3 // allowedFileTypes works fine, but it was deprecated in macOS 12.0 // dialog.allowedFileTypes = ["txt"]
解决方案:
核心是设置allowsOtherFileTypes = false,并确保获取精确的.txt文件类型,避免兼容类型被包含。
let dialog = NSOpenPanel() dialog.canChooseFiles = true dialog.canChooseDirectories = false dialog.allowsMultipleSelection = false // 获取精确的.txt文件类型 if let txtUTType = UTType(filenameExtension: "txt", conformingTo: nil) { dialog.allowedContentTypes = [txtUTType] } // 关键:禁止显示其他兼容类型的文件 dialog.allowsOtherFileTypes = false // 打开面板并处理结果 if dialog.runModal() == .OK { if let selectedURL = dialog.url { // 处理选中的txt文件 print("选中文件路径:\(selectedURL.path)") } }
说明:
- 之前的方法1使用
.text会包含所有继承自文本类型的文件(如.csv、.json等),因为这些格式的UTType都兼容.text; - 方法2、3虽然指定了txt扩展名,但默认
allowsOtherFileTypes为true,系统会自动显示兼容的文件类型; - 设置
allowsOtherFileTypes = false后,NSOpenPanel只会严格匹配allowedContentTypes中指定的类型,从而仅显示.txt文件。
内容的提问来源于stack exchange,提问作者Benji Wang
相关产品推荐
相关产品推荐

