Что эквивалентно 'window.rootViewController' в WindowGroup - SwiftUI
Я новичок в SwiftUI и столкнулся с проблемой, когда я хочу изменить корневой вид, когда внутри приложения происходит определенное действие.
Как я справляюсь с этим при использовании
SceneDelegate
было следующим
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
... // the code of initializing the window
observeOnChangeWindow()
}
func observeOnChangeWindow(){
NotificationCenter.default.addObserver(self, selector: #selector(self.performChangeWindow), name: Notification.Name(K.changeWindowNotificationName), object: nil)
}
@objc func performChangeWindow() {
self.window?.rootViewController = UIHostingController(rootView: SplashScreenView())
}
Однако в настоящее время я не использую SceneDelegate, так как инициализирую приложение с помощью WindowGroup.
struct MyApp: App {
var body: some Scene {
WindowGroup {
SplashScreenView()
}
}
}
Мой вопрос: как я могу сделать то же самое, что я делаю, используя SceneDelegate сейчас?
1 ответ
С помощью комментариев и некоторых руководств я нашел решение (проверено на iOS 15, Xcode 13.2.1):
Добавьте следующий код в главную панель запуска приложений.
struct MyApp: App {
@StateObject var appState = AppState.shared
var body: some Scene {
WindowGroup {
SplashScreenView().id(appState.environment)
}
}
}
А затем я создал класс AppState, который является классом, при изменении которого я буду менять окно.
class AppState: ObservableObject {
static let shared = AppState()
@Published var environment = "Production"
}
И всякий раз, когда я хотел изменить среду и сделать ту же функциональность изменения окна в
UIKit
, сделайте следующее:
AppState.shared.environment = "Pre-Production"