Что такое метод viewWillAppear(_:) в UIViewController?

«Что такое метод viewWillAppear(_:) в UIViewController?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 появилось на экране. Используйте его для запуска тяжелых анимаций или задач, которые не должны блокировать переход.