Ответ
Жизненный цикл UIViewController — это последовательность системных вызовов, управляющих созданием, отображением и уничтожением контроллера и его view.
Основные этапы и методы:
-
Инициализация и загрузка View:
init(coder:)/init(nibName:bundle:)– создание экземпляра контроллера.loadView()– создает или загружает иерархию view. Переопределяйте, если создаете view вручную.viewDidLoad()– Вызывается один раз после загрузки view. Идеальное место для начальной настройки UI.
-
Появление на экране:
viewWillAppear(_:)– Вызывается перед тем, как view станет видимой. Хорошее место для обновления данных или анимаций, зависящих от контекста.viewDidAppear(_:)– Вызывается после того, как view появилась на экране. Место для запуска тяжелых операций (например, сетевых запросов) или анимаций.
-
Исчезновение с экрана:
viewWillDisappear(_:)– Вызывается перед скрытием view. Место для сохранения состояния или отмены изменений.viewDidDisappear(_:)– Вызывается после того, как view скрылась.
-
Изменение layout (разметки):
viewWillLayoutSubviews()– Вызывается передlayoutSubviewsу корневой view.viewDidLayoutSubviews()– Вызывается после. Идеально для корректировки layout после расчета системой Auto Layout.
-
Управление памятью и деинициализация:
didReceiveMemoryWarning()– Уведомление о нехватке памяти.deinit– Вызывается перед освобождением контроллера из памяти.
Практический пример использования:
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Разовая настройка: добавить subviews, настроить навигацию.
setupTableView()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Обновить данные каждый раз при появлении.
tableView.reloadData()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Скорректировать frame после Auto Layout.
customView.layer.cornerRadius = customView.bounds.width / 2
}
}