You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 之前的方法1使用.text会包含所有继承自文本类型的文件(如.csv、.json等),因为这些格式的UTType都兼容.text;
  2. 方法2、3虽然指定了txt扩展名,但默认allowsOtherFileTypes为true,系统会自动显示兼容的文件类型;
  3. 设置allowsOtherFileTypes = false后,NSOpenPanel只会严格匹配allowedContentTypes中指定的类型,从而仅显示.txt文件。

内容的提问来源于stack exchange,提问作者Benji Wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:25:36