Преобразование объекта окружающей среды для удаления сцены в AppMain

#swift #swiftui #observableobject

#swift #свифтуи #observableobject

Вопрос:

Не стесняйтесь редактировать мой заголовок для большей ясности.

Я начинаю новый проект iOS и больше не использую SceneDelegate / AppDelegate. Моя проблема в том, что я хочу, чтобы мой ObservableObject был объектом среды для всего моего проекта, но у меня возникли проблемы с преобразованием и поиском недавних примеров.

Именно так я определил его в своем предыдущем проекте 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, который, как я полагаю, имел отношение к локальному хранилищу. Нужно ли мне каким-то образом передать моего наблюдателя в .environment для LoginView?

Ответ №1:

Да, все в точности так, как у вас есть в вашем примере кода, за исключением того, что по какой-то причине вы все это закомментировали. Так, например:

 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
 

и вуаля, вы наблюдаете из глобального экземпляра.

Комментарии:

1. Да, этот код был автоматически сгенерирован при создании проекта, поэтому я его прокомментировал. Не думал, что я был так близок к его реализации, большое спасибо!