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:,

Другие вопросы по тегам