将 SceneDelegate Enviromental Object 转换为 AppMain

Converting SceneDelegate Enviromental Object to AppMain

请随意编辑我的标题以便更清晰。

我正在开始一个新的 iOS 项目并且不再使用 SceneDelegate/AppDelegate。我的问题是我希望我的 ObservableObject 成为我整个项目的环境 Object,但在转换和查找最近的示例时遇到问题。

这是我在之前的 iOS 13 项目中定义的。

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

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    
    //Environmental View
    let observer = GlobalObserver()

    let baseView = SplashScreenView().environment(\.managedObjectContext, context)
       
    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = UIHostingController(rootView: baseView.environmentObject(observer))
        self.window = window
        window.makeKeyAndVisible()
    }
}

这里是我主要的简化版

@main
struct DefaultApp: App {
  
    
    //Environmental View
    let observer: GlobalObserver
    
   
    init(){
        observer = GlobalObserver()
    }

    var body: some Scene {
        WindowGroup {
            LoginView()
                //.environment(\.managedObjectContext, persistenceController.container.viewContext)
        }
    }
}

该项目生成了一个 PersistenceController,我认为它与本地存储有关。我是否需要以某种方式将我的观察者传递到 loginView 的 .environment 中?

是的,它与您在示例代码中的完全一样,只是出于某种原因您将其全部注释掉了。例如:

class Thing : ObservableObject {
    @Published var name = "Matt"
}

@main
struct SwiftUIApp: App {
    @StateObject var thing = Thing()
    var body: some Scene {
        WindowGroup {
            ContentView().environmentObject(thing)
        }
    }
}

现在,在您刚才说的任何视图结构中

@EnvironmentObject var thing : Thing

很快,您正在从全局实例进行观察。