Что эквивалентно '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"
Другие вопросы по тегам