У меня есть приложение для 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>