#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. Да, этот код был автоматически сгенерирован при создании проекта, поэтому я его прокомментировал. Не думал, что я был так близок к его реализации, большое спасибо!