UINavigationController перехватывает - popViewControllerAnimated: - PullRequest
4 голосов
/ 28 мая 2009

Итак, проблема в том, что когда кто-то касается кнопки «Назад» на UINavigationControler, я хотел бы запустить некоторый код для обновления источника данных.

Проблема в том, что я не могу найти подходящего делегата для этого. только они доступны в делегате контроллера nav, и я хочу использовать метод типа didfinishshowing.

– navigationController:willShowViewController:animated:  optional method  
– navigationController:didShowViewController:animated:  optional method  

Следующим лучшим местом, о котором я думал, была навигационная панель, но когда я попробовал это.

Завершение приложения из-за отсутствия исключение 'NSInternalInconsistencyException', причина: «Невозможно установить делегировать на UINavigationBar удалось контроллером

Это имеет смысл ретроспективно, так как вы не хотите, чтобы какой-то хакер возился с внутренними компонентами контроллера nav и не давал ему работать.

Это обычная проблема, и я упустил что-то простое.

Ответы [ 2 ]

10 голосов
/ 28 мая 2009

Просто, чтобы мы были ясны: представление A является отправной точкой. Пользователь что-то нажимает, и вы скользите вправо, чтобы просмотреть B. Пользователь нажимает кнопку «Назад», и вы переходите от B к A, и вы хотите что-то сделать в результате действия «назад».

Есть три способа сделать это (и ни один из них не должен приближаться к навигационному контроллеру - они применяются к самим базовым viewControllers):

  • Как dmercredi предлагает переопределить viewWillAppear на контроллере представления A, поэтому, когда вы возвращаетесь к нему, он обновляется. Проблема в том, что viewWillAppear также вызывается, когда A вызывается в самый первый раз. Таким образом, вам придется установить какой-то флаг, чтобы различать первый viewWillAppear и любые последующие при возвращении из B.

  • Переопределите viewWillDisappear на контроллере представления B и выполните обновление там. Это будет вызвано только когда B собирается уходить. Если на B есть что-то, что идет на один уровень глубже или вызывает модальное диалоговое окно сверху, viewWillDisappear будет вызван так, что вам придется различать приход и уход.

  • Разделите различные виды и используйте шаблон делегата. Контроллер представления A устанавливает себя в качестве делегата B и, когда B обновляет что-либо, вызывает метод делегата, поэтому A уведомляется об изменении и может обновить все, что ему нужно. Вы можете вызывать метод делегата в любое время, когда пользователь вносит изменения в B или переопределяет viewWillDisappear и просто делает это один раз при выходе.

5 голосов
/ 28 мая 2009

Добавьте ваш код обновления в анимированный метод viewWillAppear: (BOOL) на контроллере представления, который должен отображаться. В вашем случае это контроллер представления, который уже находится в стеке навигации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...