gpt4 book ai didi

在 MacOS 中使用 NSSharingServicePicker 的 SwiftUI

转载 作者:行者123 更新时间:2023-12-03 20:08:47 34 4
gpt4 key购买 nike

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

我找到了 NSSharingServicePicker适用于 MacOS 并想使用它。但是,我正在努力在 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。如何将当前 View 转换为 NSView 并以这种方式使用它。或者我可以用我的 ButtonNSView() .我正在努力采用这种方法。

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

最佳答案

这是最小的工作演示示例

demo

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"]))
}
}

关于在 MacOS 中使用 NSSharingServicePicker 的 SwiftUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60952334/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com