2009-05-28 4 views
4

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

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

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

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

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

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

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

+0

Не то, чтобы это решение, но я заметил, что если UINavigationController создается из раскадровки, вы не получаете исключение NSInternalInconsistencyException. – hyperspasm

+0

Вы также можете заставить UINavigationController иметь собственный подкласс UINavigationBar, например.'[[UINavigationController alloc] initWithNavigationBarClass: [MyNavigationBar class] toolbarClass: nil]', а затем переопределить '- (UINavigationItem *) popNavigationItemAnimated: (BOOL) animated' в подклассе UINavigationBar. – hyperspasm

ответ

5

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

+2

Это единственный правильный ответ в iOS 4.2, май 2011 года? Это так ужасно скудно, не так ли? – epologee

10

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

Есть три способа сделать это (и на ни вы должны идти рядом с navigationController - они относятся к самим нижележащих viewControllers):

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

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

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

Смежные вопросы