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