如何在 macOS 中对 NSOpenPanel 使用 allowedContentTypes?

c00*_*0fd 4 macos nsopenpanel swift swiftui

我正在尝试显示使用 SwiftUI 编写的 macOS GUI 应用程序中的文件选择器窗口。所以我称之为:

let panel = NSOpenPanel()

//panel.allowedFileTypes = ["myext"]    //I get a warning here that it's deprecated

//Trying to use the following instead:
let fileType = UTType(tag: "myext", tagClass: .filenameExtension, conformingTo: nil)
if(fileType != nil)
{
    panel.allowedContentTypes = [fileType!]
}
else
{
    assert(false)
}

panel.allowsMultipleSelection = false
panel.canChooseDirectories = false
panel.canChooseFiles = true

let resp = panel.runModal()
Run Code Online (Sandbox Code Playgroud)

面板已显示,但我无法选择任何文件,包括带有我的.myext扩展名的文件。

但如果我取消注释panel.allowedFileTypes行,一切都会按我的预期进行。

那么我做错了什么allowedContentTypes

附言。或者,至少如何在 Swift 中消除该已弃用的警告?(allowedFileTypes效果很好,弃用它有什么意义!)

Rob*_*Rob 5

如果是您自己的扩展,请添加 \xe2\x80\x9cexported 类型标识符\xe2\x80\x9d。如果是其他应用定义的类型,请添加\xe2\x80\x9c导入的类型标识符\xe2\x80\x9d。

\n

我们可以在目标设置的 \xe2\x80\x9cInfo\xe2\x80\x9d 选项卡中定义类型标识符。这将Info.plist相应地创建/更新。例如,如果它是导出的标识符:

\n

目标设置 \xc2\xbb 信息 \xc2\xbb 导出的类型标识符

\n

请记下 \xe2\x80\x9cidentifier\xe2\x80\x9d、关联的 \xe2\x80\x9cextensions\xe2\x80\x9d 以及 \xe2\x80\x9cconforms to\xe2\x80\x9d 设置。

\n

完成此操作后,我们现在可以在代码中使用该标识符。因为此示例是 \xe2\x80\x9cExported Type Identifier\xe2\x80\x9d,所以我们将使用UTType(exportedAs:)

\n
extension UTType {\n    public static let foo = UTType(exportedAs: "com.domain.foo")\n}\n
Run Code Online (Sandbox Code Playgroud)\n

进而:

\n
let panel = NSOpenPanel()\n\npanel.allowedContentTypes = [.foo]\npanel.allowsMultipleSelection = false\npanel.canChooseDirectories = false\npanel.canChooseFiles = true\n\nlet response = panel.runModal()\n
Run Code Online (Sandbox Code Playgroud)\n

foo、bar 和 baz 文件

\n

有关详细信息,请参阅 Apple \xe2\x80\x9cTech Talk\xe2\x80\x9d 视频、统一类型标识符 \xe2\x80\x94 重新介绍

\n