UIDocumentPickerViewController не показывает никакого содержимого на Mac Catalyst - PullRequest
0 голосов
/ 10 ноября 2019

UIDocumentPickerViewController работает на iOS, но не на Mac Catalyst. Есть ли альтернативы, чтобы обойти эту проблему? Кстати, NSOpenPanel недоступна на Mac Catalyst.

enter image description here

1 Ответ

0 голосов
/ 13 ноября 2019

screenshot Следующий пример для Mac Catalyst. Если вы хотите поддерживать UIDocumentPickerViewController на iOS и Mac Catalyst, вам следует использовать

#if targetEnvironment(macCatalyst)
//code for Mac Catalyst
#endif

Как поддерживать UIDocumentPickerViewController на Mac Catalyst

//SceneDelegate.swift
import UIKit
import SwiftUI

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?
    var picker = DocumentPicker()

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    let contentView = ContentView()
        // Use a UIHostingController as window root view controller.
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: contentView)
            self.window = window
            window.makeKeyAndVisible()

            window.rootViewController?.present(picker.viewController, animated: true)
        }
    }
}


//ContentView.swift
final class DocumentPicker: NSObject, UIViewControllerRepresentable {
    typealias UIViewControllerType = UIDocumentPickerViewController

    lazy var viewController: UIDocumentPickerViewController = {
        let vc = UIDocumentPickerViewController(documentTypes: ["public.data"], in: .open)
        vc.delegate = self
        return vc
    }()

    func makeUIViewController(context: UIViewControllerRepresentableContext<DocumentPicker>) -> UIDocumentPickerViewController {
        viewController.delegate = self
        return viewController
    }

    func updateUIViewController(_ uiViewController: UIDocumentPickerViewController, context: UIViewControllerRepresentableContext<DocumentPicker>) {
    }
}

extension DocumentPicker: UIDocumentPickerDelegate {
    func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
        print(urls)
    }

    func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {
        controller.dismiss(animated: true, completion: nil)
        print("cancelled")
    }
}

Спасибо Саймону, без его помощи я могуне решить эту проблему.

...