Когда вызывается метод viewDidAppear
Что проверяют
Знаете ли вы жизненный цикл UIViewController не списком, а по реальным сценариям: что вызовется при push, при возврате назад, при показе модального окна. Следом почти всегда спрашивают, чем viewDidAppear отличается от viewWillAppear и что туда стоит класть.
Как отвечать
viewDidAppear(_:) вызывается, когда представление уже в иерархии окна и анимация появления закончилась. Порядок при первом показе: viewDidLoad (один раз), viewWillAppear, viewIsAppearing, раскладка через viewWillLayoutSubviews и viewDidLayoutSubviews, затем viewDidAppear.
Вызывается он каждый раз, когда экран снова становится видимым:
- навигация: после push и после возврата, когда верхний контроллер сняли со стека;
- вкладки: при переключении на вкладку в
UITabBarController; - модальные окна: после закрытия полноэкранного окна. Если окно показано листом (
.pageSheet,.formSheet), нижний контроллер не исчезает, поэтому ниviewWillDisappear, ни повторногоviewDidAppearне получает; - дочерние контроллеры: контейнер пробрасывает вызовы сам, если ребёнок добавлен через
addChildиdidMove(toParent:).
При возврате приложения из фона метод не вызывается, для этого есть sceneWillEnterForeground или UIApplication.willEnterForegroundNotification.
Здесь уместно запускать анимации, видео и таймеры, отправлять событие просмотра экрана в аналитику, показывать алерт. Остановку кладут в viewWillDisappear или viewDidDisappear. Настройку, которой нужны размеры и trait collection, удобнее делать в viewIsAppearing: геометрия там уже известна, а экран ещё не показан.
Где спотыкаются
Забывают super.viewDidAppear(animated). Контейнеры и часть системного поведения опираются на этот вызов.
Считают, что viewWillAppear и viewDidAppear всегда идут парой. При отменённом свайпе назад нижний экран получает viewWillAppear, а viewDidAppear так и не приходит.
Грузят данные из сети в viewDidAppear без условий. Экран перезапрашивает всё при каждом возврате, пользователь видит мигание. Разовую загрузку делают в viewDidLoad, а обновление ограничивают по времени или флагу.