मैं स्विफ्टयूआई में अपने मैकोज़ ऐप के अंदर एक शेयर फ़ंक्शन का उपयोग करने का प्रयास कर रहा हूं। मेरे पास एक फाइल का यूआरएल है, जिसे मैं साझा करना चाहता हूं। यह चित्र/दस्तावेज और भी बहुत कुछ हो सकता है।

मुझे 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 के रूप में कैसे परिवर्तित कर सकता हूं और इसे इस तरह उपयोग कर सकता हूं। या क्या मैं अपने Button को NSView() के रूप में उपयोग कर सकता हूं। मैं उस दृष्टिकोण से जूझ रहा हूं।

एक अन्य विकल्प NSViewRepresentable का उपयोग करना होगा। लेकिन क्या मुझे सिर्फ एक एनएसवी व्यू बनाना चाहिए और उस विधि के लिए इसका इस्तेमाल करना चाहिए।

4
davidev 31 मार्च 2020, 16:56

1 उत्तर

सबसे बढ़िया उत्तर

यहाँ न्यूनतम कार्यशील डेमो उदाहरण है

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"]))
    }
}
6
Asperi 31 मार्च 2020, 16:58