4

У меня есть следующие среды:Изменение UINavigationController суммируется с контроллерами отображения модальных

  • вид корневой контроллер является UINavigationController
  • ряд пользовательских UIViewControllers может быть в стек навигации
  • каждого из пользовательских контроллеров может или может не отображаться контроллер модального представления
  • Мне нужно иметь возможность программно управлять стекей навигации (например, удалить все контроллеры из стека навигации, кроме корневого контроллера, в качестве ответа на какое-либо внешнее событие как доставка толчка уведомление)

наивной реализация с [navigationController setViewControllers:newControllers animated:animated]; явно терпит неудачу, если был модальный контроллер представления, представленный любом из старых контроллеров индов стеки:

  1. Этого модальный контроллер остается видимой
  2. Если делегирование используется для родителя < -> коммуникация модальных контроллеров (родитель является делегатом представленного контроллера модального представления) любое действие в контроллере модального представления приводит к сбою, поскольку делегат уже выпущен

Таким образом, общая проблема заключается в том, что жизненный цикл модального контроллера не связан с родительским контроллером. Мои вопросы:

  1. Есть ли метод stardard для управления такой иерархией и безопасными изменениями в стеке навигации?
  2. Если НЕТ, чем была бы лучшая пользовательская реализация? Я вижу два общих подхода: один заключается в том, чтобы явно отклонить/отменить привязку всех модальных контрейлеров к коду, изменяющему стек навигации, а другой - добавить логику в консоль родительского представления для управления жизненным циклом модальных контроллеров напрямую.

ответ

2

Нет стандартного подхода, поскольку это поведение не рекомендуется HIG. Даже в случае push-уведомлений вы не должны изменять существующий стек, кроме как через push, pops и pop-to-root. Однако то, что вы просите, вполне возможно.

У вас есть несколько вариантов, но лучше всего, вероятно, уведомления. Используйте NSNotificationCenter в своем делетете приложения, чтобы любой заинтересованный контроллер диспетчера взглядов знал, что вы о, чтобы получить доступ к вашему контроллеру корневого представления. В каждом из ваших контроллеров модального просмотра зарегистрируйтесь для этого имени уведомления и отпустите себя, когда будете уведомлены. После отклонения ваших модалов вы можете просто использовать popToRootViewController и избегать беспорядочности с изменением стека.

Посмотрите на TweetBot и посмотрите, как они обрабатывают push-уведомления. Полагаю, они делают хорошую работу, и они просто представляют новый контроллер модального представления. Вы можете сделать это (вложенные модальные презентации), поэтому экспериментируйте и посмотрите, что вы можете сделать, не затормозив пользователя.

1

Проверить этот метод: http://developer.apple.com/library/ios/documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html#//apple_ref/occ/instm/UINavigationController/popToRootViewControllerAnimated:

Кроме того, модальные контроллеры являются модальными по уважительной причине - привлечь внимание пользователя на одной задаче или единицы работы или независимо от вашего приложения делает. Итак, если вы хотите программно скрыть его и вернуться к другому контроллеру в стеке навигации, очевидно, что вам нужно сначала разобраться с модальным контроллером.

0

call [self rejectModalViewControllerAnimated: YES]; from - (void) viewDidUnload метод viewcontroller.

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