iOS
Средний
Какой жизненный цикл у UIViewController?
Жизненный цикл UIViewController
Порядок вызова методов:
1. init(coder:) / init(nibName:bundle:)
2. loadView()
3. viewDidLoad()
4. viewWillAppear(_:)
5. viewWillLayoutSubviews()
6. viewDidLayoutSubviews()
7. viewDidAppear(_:)
--- Контроллер видим ---
8. viewWillDisappear(_:)
9. viewDidDisappear(_:)
--- Контроллер скрыт ---
10. deinit
Детали каждого метода:
loadView()
override func loadView() {
// Создание view программно (без storyboard)
view = CustomView()
}
viewDidLoad()
override func viewDidLoad() {
super.viewDidLoad()
// Вызывается ОДИН раз
// Настройка UI, подписки, загрузка данных
setupUI()
loadData()
}
viewWillAppear(_:)
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Перед показом (может вызываться многократно)
// Обновление данных, подписки на notifications
refreshData()
}
viewDidLayoutSubviews()
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// После layout (bounds уже известны)
// Финальная настройка размеров
gradientLayer.frame = view.bounds
}
viewDidAppear(_:)
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// Контроллер полностью видим
// Анимации, аналитика
startAnimations()
}
viewWillDisappear(_:)
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// Перед скрытием
// Сохранение состояния, отписки
saveState()
}
Что изменилось в iOS 13+:
- viewIsAppearing(_:) — новый метод между willAppear и didAppear
- Trait collections обновлены до вызова
- Рекомендуется для финальной настройки размеров
Распространённые ошибки:
// ПЛОХО: в viewDidLoad размеры могут быть неточными
override func viewDidLoad() {
layer.frame = view.bounds // Может быть 0 или неверно
}
// ХОРОШО: в viewDidLayoutSubviews
override func viewDidLayoutSubviews() {
layer.frame = view.bounds // Правильные размеры
}
Похожие вопросы
Готовитесь к собеседованию?
ENIGMA AI — невидимый ИИ-помощник для технических интервью
Попробовать бесплатно