在MacOS上使用SwiftUI打开文件对话框

19

在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) {
  }
}

这是正确的方法吗?
有什么问题吗?

1个回答

52

实际上你不需要这样做,因为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)
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接