viewDidLayoutSubviews больше не вызывается при отображении вида сверху с помощью UINavigationController
iOS 10, подарок, который продолжает ломаться, похоже, изменил другое поведение.
Предположим, что два UIViewController помещены в UINavigationController.
На iOS 8/9 звонит navigationController?.popViewController(animated: true)
всплыть верхний UIViewController (скажем, VC2) вызвал viewDidLayoutSubviews
на контроллере вида снизу (скажем, VC1) для вызова.
Мы полагались на это, чтобы обновить VC1. Иногда VC2 добавляет подпредставления к VC1 (через модель данных), и это необходимо отразить при возврате к VC1.
Точная информация о кадре не требуется. Мы не можем использовать viewWillAppear
потому что данные кадра неверны на iOS 9. Проблема с viewDidAppear
в том, что существует мгновенный сбой между первоначальным просмотром вида и настройкой.
Теперь VC1 viewDidLayoutSubviews
не вызывается при подключении VC2.
1) Это ошибка для viewDidLayoutSubviews
не вызывать?
2) Как правильно обновлять контроллеры представления при подключении с помощью UINavigationController?
2 ответа
Надеется viewDidLayoutSubviews
никогда не было правильного решения. UIViewController
обеспечивает viewWillAppear:
или же viewDidAppear:
для такого использования. Когда VC2 извлекается из контроллера навигации, эти два метода будут вызываться на VC1, чтобы сообщить вам, что он будет или теперь снова виден.
viewDidLayoutSubviews
следует использовать только для настройки рам и вида.
viewWill|DidAppear:
следует использовать для обработки контроллера вида, который становится видимым изначально или снова. В вашем случае вы должны использовать это для обновления данных и добавления / обновления представлений по мере необходимости. Эти новые представления должны быть настроены на основе текущего кадра контроллера представления. Они будут скорректированы в вашей реализации viewDidLayoutSubviews
по мере необходимости.
Я дополню ответ Рмадди. Вам нужно отделить выполнение макета и обновления ваших данных. Если ваш поток таков, что данные должны обновляться, когда представление должно появиться, вы должны обновить данные поддержки вашего контроллера в viewWillAppear:
, перезагрузите ваши представления и затем пометьте представление как нужное расположение, используя setNeedsLayout
, Это заставит систему выполнить компоновку в представлении контроллера и запустит компоновку. Таким образом, вы можете убедиться, что макет выполнен, как только представление будет готово, а не раньше (как часто бывает в случае viewWillAppear:
,