SwiftUI, использующий NSSharingServicePicker в MacOS - PullRequest
3 голосов
/ 31 марта 2020

Я пытаюсь использовать функцию «Поделиться» внутри моего приложения MacOS в SwiftUI. У меня есть 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. Как я могу преобразовать мой текущий вид как NSView и использовать его таким образом. Или я могу использовать свой Button как NSView(). Я борюсь с этим подходом.

Другой вариант - использовать NSViewRepresentable. Но я должен просто создать NSView и использовать его для этого метода.

1 Ответ

2 голосов
/ 31 марта 2020

Вот пример минимального рабочего демо

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"]))
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...