Как реализовать выбор принтера с помощью SwiftUI? - PullRequest
0 голосов
/ 20 марта 2020

Я использовал класс UIPrinterPickerController для реализации выбора принтера. Теперь я хочу реализовать средство выбора принтера, используя SwiftUI . Я старался изо всех сил, но не нашел никакого решения. Я буду очень признателен за вашу помощь.

1 Ответ

1 голос
/ 20 марта 2020

Да, это не так тривиально, поэтому здесь возможен подход. Протестировано и работает с Xcode 11.4 / iOS 13.4

Примечание: убедитесь, что вы активировали Печать в проекте Подпись и возможности Настройки.

I у вас нет принтеров AirPrint, так что ... просто ищите

enter image description here

Демонстрационный код:

struct DemoPrinterPicker: View {
    @State private var showPicker = false

    var body: some View {
        Button("Select Printer") {
            self.showPicker.toggle()
        }
        .background(PrinterPickerController(showPrinterPicker: $showPicker))
    }
}

SwiftUI представимый ( просто показывает сборщик принтеров, что делать с выбранным принтером - ваша ответственность)

struct PrinterPickerController: UIViewControllerRepresentable {
    @Binding var showPrinterPicker: Bool

    fileprivate let controller = UIViewController()

    func makeUIViewController(context: Context) -> UIViewController {
        controller
    }

    func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
        if showPrinterPicker && context.coordinator.activePicker == nil {
            let picker = UIPrinterPickerController(initiallySelectedPrinter: nil)
            context.coordinator.activePicker = picker

            picker.delegate = context.coordinator
            picker.present(animated: true) { (picker, flag, error) in
                if let printer =  picker.selectedPrinter {
                    // << do anything needed with printer
                }

                context.coordinator.activePicker = nil
                self.showPrinterPicker = false
            }
        }
    }

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

    class Coordinator: NSObject, UIPrinterPickerControllerDelegate {
        let owner: PrinterPickerController
        var activePicker: UIPrinterPickerController?

        init(_ owner: PrinterPickerController) {
            self.owner = owner
        }

        func printerPickerControllerParentViewController(_ printerPickerController: UIPrinterPickerController) -> UIViewController? {
            self.owner.controller
        }
    }

    typealias UIViewControllerType = UIViewController
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...