> Что происходит в методах viewDidLoad и viewWillAppear при добавлении view в иерархию (iOS, Swift)

Уровень: middle · Роль: mobile · Категория: Технические вопросы

Компании: Bip.ru

Стек: iOS, Swift

> Пример ответа

Короткий ответ

viewDidLoad вызывается один раз после создания view controller и загрузки его view в память, но до добавления в иерархию. viewWillAppear вызывается каждый раз перед тем, как view станет видимым и будет добавлен в window. В viewDidLoad выполняют одноразовую настройку, в viewWillAppear - обновление данных и состояния перед показом.

Подробное объяснение

Жизненный цикл view controller при добавлении view в иерархию выглядит так:

  1. Загрузка view - при обращении к свойству view или при переходе на экран создаётся иерархия subviews (из storyboard, xib или программно).
  2. viewDidLoad - вызывается сразу после загрузки view в память. View уже существует, но ещё не добавлен в window и не видим. Этот метод вызывается только один раз за время жизни view controller.
  3. viewWillAppear - вызывается перед тем, как view будет добавлен в иерархию window и станет видимым. Вызывается каждый раз при показе экрана (включая возврат с другого экрана).
  4. viewDidAppear - после добавления и отображения.
  5. viewWillDisappear / viewDidDisappear - при удалении из иерархии.

Ключевое различие: viewDidLoad - это момент, когда view уже создан, но ещё не в иерархии. viewWillAppear - момент перед добавлением в иерархию, когда можно выполнить финальные приготовления.

На практике

  • В viewDidLoad настраивают UI-элементы, подписки, делегаты, начальные значения - всё, что не зависит от видимости.
  • В viewWillAppear обновляют данные, которые могли измениться, пока экран был скрыт, настраивают navigation bar, скрывают/показывают элементы, обновляют layout при изменении размеров.
  • Не выполняйте тяжёлые операции в viewWillAppear, так как он вызывается часто.
  • Если нужно знать точный размер view - используйте viewDidLayoutSubviews или viewWillLayoutSubviews, так как в viewDidLoad размеры ещё не финальны.

Пример кода

SWIFT
final class ProfileViewController: UIViewController {
private let titleLabel = UILabel()
private var user: User?
override func viewDidLoad() {
super.viewDidLoad()
// одноразовая настройка
setupUI()
configureLabel()
// подписки, делегаты
NotificationCenter.default.addObserver(
self,
selector: #selector(userDidUpdate),
name: .userDidUpdate,
object: nil
)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// обновление данных перед показом
loadUserData()
// настройка navigation bar
navigationController?.setNavigationBarHidden(false, animated: true)
// обновление layout под текущий размер
view.layoutIfNeeded()
}
private func setupUI() {
view.addSubview(titleLabel)
// constraints...
}
}

Как отвечать на собеседовании

Начните с чёткого разграничения: viewDidLoad - один раз, viewWillAppear - каждый раз. Затем объясните порядок вызовов при добавлении view в иерархию. Приведите примеры, что куда класть. Упомяните, что viewDidLoad не гарантирует, что view уже в window, а viewWillAppear - что view будет добавлен сразу после вызова. Если спросят про loadView - упомяните, что он вызывается до viewDidLoad.

Что проверяет интервьюер

  • Понимание жизненного цикла view controller.
  • Умение различать одноразовые и повторяющиеся операции.
  • Знание, когда view реально появляется в иерархии.
  • Понимание, что viewDidLoad не связан с видимостью, а viewWillAppear - связан.
  • Способность объяснить, почему нельзя полагаться на размеры view в viewDidLoad.

Типичные ошибки

  • Утверждение, что viewDidLoad вызывается при добавлении view в иерархию - на самом деле он вызывается при загрузке view в память.
  • Выполнение тяжёлых операций в viewWillAppear без необходимости.
  • Использование viewDidLoad для обновления данных, которые меняются при каждом показе.
  • Путаница между viewWillAppear и viewDidAppear - первый вызывается до добавления, второй после.
  • Игнорирование того, что viewWillAppear может вызываться без добавления view в window (например, при презентации другого экрана поверх).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью