在MacOS中使用NSSharingServicePicker的SwiftUI

在MacOS中使用NSSharingServicePicker的SwiftUI,swift,macos,swiftui,Swift,Macos,Swiftui,我正在尝试在SwiftUI的MacOS应用程序中使用共享功能。我有一个指向某个文件的URL,我想共享该文件。它可以是图像/文档等 我找到了MacOS的NSSharingServicePicker,并想使用它。然而,我正在努力在SwiftUI中使用它 根据文档,我创建了如下内容: let shareItems = [...] let sharingPicker : NSSharingServicePicker = NSSharingServicePicker.init(items: shareI

我正在尝试在SwiftUI的MacOS应用程序中使用共享功能。我有一个指向某个文件的URL,我想共享该文件。它可以是图像/文档等

我找到了MacOS的
NSSharingServicePicker
,并想使用它。然而,我正在努力在SwiftUI中使用它

根据文档,我创建了如下内容:

let shareItems = [...]

let sharingPicker : NSSharingServicePicker = NSSharingServicePicker.init(items: shareItems as [Any])

sharingPicker.show(relativeTo: NSZeroRect, of:shareView, preferredEdge: .minY)
我的问题在于
show()
方法。我需要设置一个NSRect,在这里我可以使用NSZeroRect。。但是我正在努力使用
of:
参数。它需要一个NSView。如何将当前视图转换为NSView并以这种方式使用。或者我可以使用我的
按钮作为
NSView()
。我正在与这种方法作斗争


另一种选择是使用
NSViewRepresentable
。但是我应该创建一个NSView并将其用于该方法吗

这里是最简单的工作演示示例


太棒了:)非常感谢。。顺便问一下,你知道有没有开着。。类似Finder的上下文菜单可用?@davidev您找到方法了吗?
struct SharingsPicker: NSViewRepresentable {
    @Binding var isPresented: Bool
    var sharingItems: [Any] = []

    func makeNSView(context: Context) -> NSView {
        let view = NSView()
        return view
    }

    func updateNSView(_ nsView: NSView, context: Context) {
        if isPresented {
            let picker = NSSharingServicePicker(items: sharingItems)
            picker.delegate = context.coordinator

            // !! MUST BE CALLED IN ASYNC, otherwise blocks update
            DispatchQueue.main.async {
                picker.show(relativeTo: .zero, of: nsView, preferredEdge: .minY)
            }
        }
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(owner: self)
    }

    class Coordinator: NSObject, NSSharingServicePickerDelegate {
        let owner: SharingsPicker

        init(owner: SharingsPicker) {
            self.owner = owner
        }

        func sharingServicePicker(_ sharingServicePicker: NSSharingServicePicker, didChoose service: NSSharingService?) {

            // do here whatever more needed here with selected service

            sharingServicePicker.delegate = nil   // << cleanup
            self.owner.isPresented = false        // << dismiss
        }
    }
}
struct TestSharingService: View {
    @State private var showPicker = false
    var body: some View {
        Button("Share") {
            self.showPicker = true
        }
        .background(SharingsPicker(isPresented: $showPicker, sharingItems: ["Message"]))
    }
}