在 MacO 上的 SwiftUI 中打开 FileDialog

mic*_*ica 5 macos swift swiftui

在 MacOS 上的 SwiftUI 应用程序中,我希望允许用户从 MacOS 文件系统中选择一个文件。
我尝试使用 AppKits NSOpenPanel

我试过这样,但我无法创建 NSViewControllerRepresentable。

struct ContentView: View {
  @State var filename = "Filename"
  @State var showFileChooser = false

  var body: some View {
    HStack {
      Text(filename)
      Button("select File")
      { self.showFileChooser = true
      }.sheet(isPresented: $showFileChooser)
      { FileChooser()
      }
    }
    .frame(maxWidth: .infinity, maxHeight: .infinity)
  }
}

struct FileChooser : {
  func makeNSViewController(context: Context) -> NSOpenPanel {
    NSOpenPanel()
  }

  func updateNSViewControler(_ nsView: NSOpenPanel, context: Context) {
  }
}
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?
怎么了?

Asp*_*eri 13

实际上你不需要,因为它NSOpenPanel是一个窗口,而不是一个视图控制器。

这是可能的方法。使用 Xcode 11.7 / macOS 10.15.6 测试

struct ContentView: View {
  @State var filename = "Filename"
  @State var showFileChooser = false

  var body: some View {
    HStack {
      Text(filename)
      Button("select File")
      {
        let panel = NSOpenPanel()
        panel.allowsMultipleSelection = false
        panel.canChooseDirectories = false
        if panel.runModal() == .OK {
            self.filename = panel.url?.lastPathComponent ?? "<none>"
        }
      }
    }
    .frame(maxWidth: .infinity, maxHeight: .infinity)
  }
}
Run Code Online (Sandbox Code Playgroud)