Жизненный цикл UIViewController состоит из ключевых методов, которые вызываются системой в определенные моменты времени. Понимание этих методов критически важно для правильного управления ресурсами и поведением контроллера.
init(nibName: String?, bundle: Bundle?) // Инициализация из NIB
init(coder: NSCoder) // Инициализация из Storyboard
Когда: При создании экземпляра контроллера
Использование: Настройка начального состояния, инициализация свойств
loadView() // Создание иерархии view
Когда: Когда требуется создать view контроллера
Использование: Ручное создание view (без Storyboard/XIB)
viewDidLoad() // View загружена в память
Когда: Один раз после загрузки view в память
Использование: Начальная настройка интерфейса, загрузка данных
viewWillAppear(_ animated: Bool) // Перед появлением view
Когда: Перед каждым появлением view на экране
Использование: Обновление данных, анимации, скрытие/показ элементов
viewDidAppear(_ animated: Bool) // После появления view
Когда: После полного появления view на экране
Использование: Запуск анимаций, аналитика, тяжелые операции
viewWillDisappear(_ animated: Bool) // Перед исчезновением view
Когда: Перед каждым исчезновением view с экрана
Использование: Сохранение данных, остановка анимаций
viewDidDisappear(_ animated: Bool) // После исчезновения view
Когда: После полного исчезновения view с экрана
Использование: Очистка ресурсов, отписка от уведомлений
viewWillLayoutSubviews() // Перед расчетом layout
viewDidLayoutSubviews() // После расчета layout
Когда: При изменении размеров view (поворот, изменение constraints)
Использование: Корректировка layout перед/после AutoLayout
didReceiveMemoryWarning() // Нехватка памяти
Когда: При нехватке памяти в системе
Использование: Освобождение неиспользуемых ресурсов
updateViewConstraints() // Обновление constraints
Когда: При необходимости обновить constraints
Использование: Динамическое изменение layout
willMove(toParent: UIViewController?) // Перед добавлением/удалением
didMove(toParent: UIViewController?) // После добавления/удаления
Когда: При работе с дочерними контроллерами
Использование: Настройка иерархии контроллеров
init
loadView
(если view == nil)viewDidLoad
viewWillAppear
viewWillLayoutSubviews
viewDidLayoutSubviews
viewDidAppear
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Однократная настройка
setupInitialState()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Обновление данных при каждом показе
refreshData()
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
// Очистка ресурсов
cleanupResources()
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
// Адаптация под новые размеры
adjustLayoutForSize(view.bounds.size)
}
}
init
→ loadView
→ viewDidLoad
viewWillAppear
→ viewDidAppear
viewWillDisappear
→ viewDidDisappear
viewWillLayoutSubviews
→ viewDidLayoutSubviews
didReceiveMemoryWarning
Правильное использование жизненного цикла позволяет: