В каком сценарии вызывается viewWillAppear, но не вызывается viewDidAppear?

«В каком сценарии вызывается viewWillAppear, но не вызывается viewDidAppear?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

viewWillAppear(_:) может быть вызван, а viewDidAppear(_:) — нет, если процесс отображения контроллера был прерван до его завершения.

Основные сценарии:

  1. Контроллер удален из иерархии навигации. viewWillAppear сообщает о предстоящем появлении, но если контроллер сразу удалить (например, вернуться назад), viewDidAppear не сработает.

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("viewWillAppear вызван")
        // Немедленное удаление контроллера
        navigationController?.popViewController(animated: false)
    }
    // viewDidAppear не будет вызван
  2. Приложение переходит в фоновый режим. Если после viewWillAppear приложение сворачивается (applicationDidEnterBackground), анимация появления прерывается, и viewDidAppear не вызывается.

  3. Появление перекрыто модальным контроллером. Если поверх контроллера, который вот-вот появится, мгновенно отображается модальное окно, его viewDidAppear может не наступить.

Ключевое различие методов:

  • viewWillAppear — уведомление о планируемом появлении view на экране.
  • viewDidAppear — уведомление о фактическом завершении анимации появления и полном отображении view.