Ответ
viewWillAppear(_:) — это метод жизненного цикла контроллера представления (UIViewController), который вызывается перед каждым появлением его view на экране, непосредственно перед анимацией перехода.
Основное назначение: Подготовка интерфейса и данных к предстоящему показу. В отличие от viewDidLoad(), он может вызываться многократно.
Типичные сценарии использования:
- Обновление данных на экране: Актуальная информация (список писем, баланс счета) подгружается или обновляется.
- Настройка состояния UI: Включение/выключение элементов, обновление заголовка.
- Запуск/возобновление анимаций.
- Отслеживание аналитики (заход на экран).
Пример:
class NewsFeedViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
var newsItems: [NewsItem] = []
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated) // Всегда вызывайте super
// 1. Обновляем данные перед показом
refreshData()
// 2. Настраиваем UI состояние
navigationController?.setNavigationBarHidden(false, animated: animated)
// 3. Делаем выделенную ячейку невыделенной при возврате
if let selectedIndexPath = tableView.indexPathForSelectedRow {
tableView.deselectRow(at: selectedIndexPath, animated: animated)
}
}
private func refreshData() {
// Загрузка свежих данных из сети или кэша
DataService.shared.fetchLatestNews { [weak self] newItems in
self?.newsItems = newItems
self?.tableView.reloadData()
}
}
}
Ключевые особенности:
- Параметр
animated: Указывает, будет ли появление анимированным (например, при push-переходе —true, при модальном презенте — может бытьfalse). - Многократный вызов: Вызывается при каждом появлении view: первый раз после
viewDidLoad, а также при возврате с другого экрана (pop из навигационного стека, dismiss модального окна). - Геометрия: Как и в
viewDidLoad(), финальные размеры view могут быть еще не установлены. Для кода, зависящего от лейаута, используйтеviewDidLayoutSubviews()илиviewWillLayoutSubviews(). - Парный метод:
viewDidAppear(_:)вызывается после того, как view появилось на экране. Используйте его для запуска тяжелых анимаций или задач, которые не должны блокировать переход.