DevPrep

Все темы › Среды разработки и SDK

Жизненный цикл ViewController

Junior PRO

Порядок вызовов

  1. init(coder:) / init(nibName:bundle:) / свой init — объект создан, view ещё нет.
  2. loadView() — вызывается лениво, при первом обращении к view (не при создании контроллера). Загружает view из storyboard/XIB или создаёт пустую; переопределяют, чтобы собрать корневую view в коде, и тогда super.loadView() не вызывают.
  3. viewDidLoad() — view в памяти, outlets подключены. Вызывается один раз. Здесь добавляют subviews, констрейнты, подписки. bounds уже есть, но размер не финальный (из storyboard или нулевой) — геометрию тут не читают.
  4. viewWillAppear(_:) — view сейчас добавят в иерархию. Вызывается при каждом показе. Подходит для обновления данных, которые могли измениться, пока экран был скрыт.
  5. viewIsAppearing(_:) (iOS 17, back-deploy до iOS 13) — view уже в иерархии, traitCollection и геометрия родителя актуальны, но первый кадр ещё не нарисован. Apple рекомендует именно его для UI, зависящего от размеров и traits (вместо viewWillAppear и viewDidLayoutSubviews).
  6. viewWillLayoutSubviews() / viewDidLayoutSubviews() — вокруг layoutSubviews() корневой view; вызываются много раз (поворот, клавиатура, изменение констрейнтов). Здесь — ручной layout и чтение финальных frame.
  7. viewDidAppear(_:) — экран показан, анимация перехода завершена. Старт анимаций, запрос разрешений, фокус на поле. Начинать загрузку данных тут поздно — экран успеет показаться пустым; её запускают в viewDidLoad.
  8. viewWillDisappear(_:) — view уходит с экрана: pop, dismiss, push следующего контроллера, переключение вкладки. Сохранение черновика, остановка таймеров.
  9. viewDidDisappear(_:) — view убрана из иерархии.
  10. deinit — контроллер освобождён. Если не вызывается после закрытия — утечка (чаще всего retain cycle в замыкании).

Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.

Полный ответ — в DevPrep

Потренируйтесь перед собеседованием

В DevPrep эти ответы превращаются в задачи на минуту: что напечатает код, найди баг, пробное собеседование. По задаче в день.

Скачать DevPrep в App Store