Ответ
В стандартном, корректно реализованном жизненном цикле — нет. Ожидаемая последовательность: viewWillAppear -> viewDidAppear.
Однако, теоретически возможно в результате ошибок программирования или вмешательства в системные процессы:
-
Некорректное переопределение
viewWillAppear. Если разработчик в своем переопределении не вызываетsuper.viewWillAppear(_:)(или вызывает его не всегда), система может продолжить выполнение цикла и вызватьviewDidAppear.override func viewWillAppear(_ animated: Bool) { // Нарушение контракта: super не вызывается if someCondition { return // viewWillAppear суперкласса пропущен } super.viewWillAppear(animated) } // viewDidAppear все равно может быть вызван системой -
Прямой вызов
viewDidAppearиз кода (что является крайне плохой практикой). -
Сложные анимации или переходы между контроллерами, где система может оптимизировать или пропустить промежуточные шаги в редких, недокументированных случаях.
Важно: Такое поведение считается аномальным и почти всегда указывает на баг в коде. Не следует полагаться на него или пытаться его воспроизвести в рабочем приложении.
Ответ 18+ 🔞
А, слушай, вот это интересный вопрос, прям в дебри жизненного цикла лезешь. Так, по-человечьи.
Если всё сделано по уму, как задумали эти, блядь, умники из Купертино, то нихуя такого не будет. Чёткий порядок: сначала система тебе орет viewWillAppear — типа, «чувак, готовься, щас тебя на экран выкинем!». А потом, когда уже выкинула и всё отрисовалось, говорит viewDidAppear — «всё, сиди, красуйся».
Но! Это ж программирование, ёпта! Тут всегда есть «но», как дырка в жопе. Теоретически, если накосячить по-крупному, то viewDidAppear может выстрелить, а viewWillAppear — проехать мимо кассы. Это как прийти в гости и сразу сесть жрать, минуя этап «раздевайся, привет, как дела».
Смотри, как такое можно устроить, сам того не желая:
-
Насрать в переопределении метода. Самый частый грех. Написал
override func viewWillAppear, а внутри забыл или специально не вызвалsuper.viewWillAppear(animated). Система думает: «О, а этот чувак сам всё взял в свои руки, ну и хуй с ним, поехали дальше». И может спокойно вызвать потомviewDidAppear. Код говна пример:override func viewWillAppear(_ animated: Bool) { // А супер-то мы и не позвали, хи-хи! if someCrazyCondition { return // Просто свалили нахуй из метода } // А этот super может и не дождатьсяся super.viewWillAppear(animated) } // А viewDidAppear-то придет! Сюрприз, блядь! -
Впендюрить
viewDidAppearруками. Ну это вообще пиздец, уровень «я сам себе режиссёр». Прямой вызовself.viewDidAppear(true)из кода. Это как взять и самому себе крикнуть «АП!» — выглядит идиотски и всё сломает. -
Системные глюки на стыке анимаций. В очень ебейших ситуациях, когда пять контроллеров одновременно лезут в одну навигейшен-дыру, система может, в попытках не обосраться, схалтурить и что-то пропустить. Но это уже из разряда «увидел НЛО».
Короче, главная мысль: Если у тебя viewDidAppear вызывается, а viewWillAppear — нет, это не фича, а кривой, ёбаный баг. Надо не радоваться, а искать, где ты налажал. На это поведение полагаться — всё равно что строить дом на говне. Рано или поздно, блядь, рухнет.