Вопрос проверяет знание жизненного цикла приложения и понимание, где корректно управлять корневым экраном.
Корневой viewController корректно подменять после создания UIWindow.
Чаще всего это делается в SceneDelegate или AppDelegate.
Подмена выполняется через свойство rootViewController.
Важно, чтобы окно уже существовало и было активным.
Подмена корневого контроллера — частая задача при логине, логауте или переключении сценариев приложения.
Перед перечислением важно отметить, что корневой контроллер принадлежит окну, а не отдельному экрану.
SceneDelegateОсновное место для iOS 13+.
window?.rootViewController = MainViewController()
window?.makeKeyAndVisible()
окно уже создано
безопасно менять корневой контроллер
подходит для навигации между flow
AppDelegateИспользуется:
в проектах без сцен
для поддержки старых версий iOS
в viewDidLoad
в viewWillAppear
внутри обычного UIViewController
Это приводит к некорректному состоянию UI и проблемам с иерархией.
Корневой viewController всегда меняется на уровне окна. Лучшее место — SceneDelegate, так как там гарантированно существует UIWindow.