在 SceneDelegate SwiftUI 上设置 managedObjectContext

Posted

技术标签:

【中文标题】在 SceneDelegate SwiftUI 上设置 managedObjectContext【英文标题】:Setup managedObjectContext on SceneDelegate SwiftUI 【发布时间】:2020-05-20 19:42:04 【问题描述】:

我按照入门屏幕教程进行操作,但似乎它主要是 UIKit 的改编版,在 AppDelegate 上我收到以下紫色错误:

Context in environment is not connected to a persistent store coordinator: <NSManagedObjectContext: 0x6000018d5880>

我相信这是在 SceneDelegate 中的设置方式,managedObjectContext 没有被传递到下一个屏幕,这就是我的方式:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 

    // Use a UIHostingController as window root view controller.
    if let windowScene = scene as? UIWindowScene 
        let window = UIWindow(windowScene: windowScene)

        // Set the MotherView as the root view
        window.rootViewController = UIHostingController(rootView: MotherView().environmentObject(ViewRouter()))
        self.window = window
        window.makeKeyAndVisible()
    

如果我不使用核心数据当然可以。如何在此处集成 ViewRouter():

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 

    // 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 = MotherView().environment(\.managedObjectContext, context)

    // Use a UIHostingController as window root view controller.
    if let windowScene = scene as? UIWindowScene 
        let window = UIWindow(windowScene: windowScene)

        // Set the MotherView as the root view
        window.rootViewController = UIHostingController(rootView: contentView)
        self.window = window
        window.makeKeyAndVisible()
    

我去了this 的帖子,但它对我没有用,有没有办法可以在 SceneDelegate 中解决这个问题?

【问题讨论】:

看起来像 ***.com/questions/59166513/… 的副本。你可能想看看那里 嗨@lennartk,我已经看过那篇文章,但我不知道如何解决它 【参考方案1】:

在任何地方将环境对象附加到构造的内容视图中,例如如下

let contentView = MotherView()
                     .environment(\.managedObjectContext, context)
                     .environmentObject(ViewRouter())

【讨论】:

以上是关于在 SceneDelegate SwiftUI 上设置 managedObjectContext的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI中如何使用@EnvironmentObject在AppDelegate和SceneDelegate/Views之间共享数据

SwiftUI如何从视图调用或通知scenedelegate

如何通过读取环境对象来纠正此问题? (SwiftUI 并且在没有 SceneDelegate 的情况下工作)

SwiftUI SceneDelegate - contentView 在调用中缺少参数“索引”的参数

有没有办法在 iOS 14 应用程序生命周期中调用 SceneDelegate 方法?

SwiftUI - 如何在 macOS 上隐藏窗口标题