Как получить доступ к основным данным в представлении swiftUI при представлении из раскадровки UIKit - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть приложение для iOS, которое использует раскадровки UIKit. Я решил использовать SwiftUI View для определенного вида и функции, которую я хотел бы добавить. Представить SwiftUI на самом деле не проблема, так как есть несколько уроков о том, как это сделать.

Однако реальная проблема заключается в том, что, поскольку я использую Базовые данные для Модели данных приложения, этому представлению SwiftUI необходим доступ к Базовым данным, в частности к ManagedObjectContext (MOC).

Как правило, для этого вы будете использовать объекты @Environment или @Bindable в сочетании с функцией willConnectTo объекта SceneDelegate. Но это обычно используется, когда SwiftUI является начальной сценой или представлением для приложения. Поскольку первоначальный вид приложения представляет собой стандартную раскадровку UIKit, кто-нибудь знает, как вручную получить доступ к основным данным из представления SwiftUI? Есть ли способ определить, что новой сценой является SwiftUI, и тем самым дать ему доступ к MOC?

Я попытался поиграть с типичным Scene willConnectTo в SceneDelegate, но он просто заканчивает тем, что заставлял новое представление SwiftUI поверх начального представления раскадровки UIKit.

// Swift SceneDelegate will App моего приложения willConnectTo (еще раз, потому что я использую раскадровку UIKit для основного представления представлений: func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { // Use this method to optionally configure and attach the UIWindow <code>window для предоставленного UIWindowScene scene. // При использовании раскадровки свойство window будет автоматически инициализировано и присоединено к сцене. //Этот делегат не подразумевает, что соединяющая сцена или сеанс являются новыми (см. application:configurationForConnectingSceneSession). Guard let _ = (сценарий как? UIWindowScene) else {return}} </p> <p>//Swift Typical SceneDelegate willConnectTo: <code> func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { // Use this method to optionally configure and attach the UIWindow <code>window в предоставленный UIWindowScene scene. // Если используетсяраскадровка, свойство окна будет автоматически инициализировано и присоединено к сцене. // Этот делегат не подразумевает, что присоединяемая сцена или сеанс являются новыми (см. вместо этого application: configurationForConnectingSceneSession ).

// Get the managed object context from the shared persistent container.
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    // Create the SwiftUI view and set the context as the value for the managedObjectContext environment keyPath.
    // Add `@Environment(\.managedObjectContext)` in the views that will need the context.
    let contentView = ContentView().environment(\.managedObjectContext, context)

    // 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()
    }
}<code>
</code>
...