В каких случаях вызывается viewWillAppear, но не вызывается viewDidDisappear в iOS?
Что проверяют
Знаете ли вы жизненный цикл UIViewController не по схеме, а по реальным переходам, где методы приходят непарно. Главный ожидаемый пример это отменённый жест «назад». Следом обычно спрашивают, где тогда подписываться на события и где отписываться.
Как отвечать
Сначала поправьте пары: viewWillAppear парный к viewDidAppear, а viewWillDisappear к viewDidDisappear. Гарантии, что за каждым «will» придёт «did», нет. Случаи, когда viewWillAppear приходит без viewDidDisappear перед ним:
- отменённый interactive pop: пользователь начал свайп назад в
UINavigationController, верхний контроллер получилviewWillDisappear, потом палец отпустили. Контроллер снова получаетviewWillAppearиviewDidAppear, аviewDidDisappearтак и не приходит; - отменённое закрытие шторки: то же с модальным
.pageSheet, когда свайп вниз не довели до конца; - первый показ: исчезать ещё было нечему, тривиальный, но честный пример;
- свои контейнеры: если
shouldAutomaticallyForwardAppearanceMethodsвозвращаетfalse, аbeginAppearanceTransitionиendAppearanceTransitionвызваны несимметрично, методы приходят в любом сочетании.
Полезно добавить обратную ситуацию. С iOS 13 модальный экран по умолчанию открывается шторкой, и контроллер под ней не получает ни viewWillDisappear, ни viewWillAppear после закрытия. Обновление данных в viewWillAppear тогда не срабатывает, нужен колбэк от модального экрана или UIAdaptivePresentationControllerDelegate. Для настройки, зависящей от размеров, есть viewIsAppearing(_:), он работает с iOS 13 при сборке на актуальном SDK.
Где спотыкаются
Утверждают, что при возврате из фона вызывается viewWillAppear. Не вызывается, для этого есть sceneWillEnterForeground или UIApplication.willEnterForegroundNotification.
Подписываются в viewWillAppear, а отписываются в viewDidDisappear. После отменённого свайпа подписка удваивается, и обработчик срабатывает дважды.
Кладут в viewWillAppear одноразовую настройку, ожидая, что метод вызовется один раз за жизнь экрана.