Этот вопрос проверяет понимание жизненного цикла iOS-приложения и способность программно управлять корневым контроллером, что необходимо для динамической навигации или кастомных переходов.
В iOS-приложениях на UIKit rootViewController — это корневой контроллер представления, который управляет основным содержимым окна приложения (UIWindow). Установка этого контроллера вручную требуется, когда нужно отказаться от Storyboard, реализовать сложную логику запуска или динамически менять весь интерфейс приложения (например, переключаться между потоком авторизации и основным приложением).
В современных приложениях (начиная с iOS 13) точка входа — это SceneDelegate. В методе scene(_:willConnectTo:options:) создается окно и устанавливается корневой контроллер.
// Пример в SceneDelegate.swift
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
// 1. Создаем окно
window = UIWindow(windowScene: windowScene)
// 2. Создаем и настраиваем корневой контроллер
let rootVC = MainViewController() // Ваш кастомный контроллер
let navigationController = UINavigationController(rootViewController: rootVC)
// 3. Устанавливаем rootViewController для окна
window?.rootViewController = navigationController
// 4. Делаем окно ключевым и видимым
window?.makeKeyAndVisible()
}Иногда требуется заменить корневой контроллер во время работы приложения (например, после успешного входа). Это делается с анимацией:
// Функция для перехода к основному экрану после авторизации
func switchToMainApp() {
guard let window = UIApplication.shared.windows.first else { return }
let mainVC = TabBarController() // Новый корневой контроллер
// Опционально: добавляем анимацию перехода
UIView.transition(with: window, duration: 0.3, options: .transitionCrossDissolve, animations: {
window.rootViewController = mainVC
}, completion: nil)
}Такой подход часто используется в приложениях с раздельными потоками для авторизованных и неавторизованных пользователей, а также в приложениях без Storyboard (программная верстка).
Итог: Ручная установка rootViewController нужна для полного контроля над иерархией представлений в приложении, особенно при реализации сложной логики запуска, кастомных переходов между модулями или при отказе от Storyboard в пользу программного UI.