Что происходит в методах viewDidLoad и viewWillAppear при добавлении view в иерархию
Что проверяют
Понимаете ли вы, что viewDidLoad связан с загрузкой view, а не с появлением на экране, и в какой момент жизненного цикла геометрия уже известна. Следом часто просят правильно добавить дочерний контроллер и спрашивают, почему у него не вызвался viewWillAppear.
Как отвечать
viewDidLoad: вызывается один раз послеloadView, когдаviewсоздан впервые. Триггер это первое обращение к свойствуview, а не добавление в иерархию: если вinitнаписатьview.backgroundColor = .red, загрузка случится сразу. Здесь настраивают subviews и констрейнты, регистрируют ячейки, подписываются на данные. Размеры ещё не финальные,view.windowравенnil;viewWillAppear(_:): вызывается перед каждым появлением, в том числе при возврате назад по стеку навигации. Место для обновления данных, которые могли измениться, и для настройки навигационной панели;viewIsAppearing(_:): добавлен в iOS 17 SDK и работает начиная с iOS 13. Здесьviewуже в иерархии, трейты и геометрия актуальны, поэтому код, зависящий от размеров, лучше переносить сюда изviewWillAppear;viewDidAppear(_:): переход закончен, можно запускать анимации и аналитику показа экрана.
Для дочернего контроллера порядок такой: addChild(_:), затем addSubview его view, затем didMove(toParent:). Тогда UIKit сам пересылает ему вызовы появления. Если вставить только view без addChild, контроллер выпадает из иерархии контроллеров, и вызовы появления, трейты и повороты до него доходят непредсказуемо.
Где спотыкаются
Считают кадры в viewDidLoad через view.bounds и получают размер из сториборда или нулевой. Расчётам по геометрии место в viewDidLayoutSubviews или viewIsAppearing.
Запускают запросы и подписки в viewWillAppear без парной отписки в viewWillDisappear. Экран показывается несколько раз, и подписки дублируются.
Считают, что за viewWillAppear обязательно последует viewDidAppear. При отменённом интерактивном свайпе назад нижний экран получит viewWillAppear, а затем сразу viewWillDisappear и viewDidDisappear.