Изменение стека UINavigationController с помощью контроллеров модального просмотра

У меня есть следующая среда:

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

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

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

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

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

3 Solutions collect form web for “Изменение стека UINavigationController с помощью контроллеров модального просмотра”

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

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

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

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

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

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

  • Интерфейс Builder IB - контроллер навигации, пропускающий представление
  • Использование одного и того же View Controller для добавления, отображения и редактирования
  • Добавление контроллера сегмента на панели навигации во второй строке
  • Назначить настраиваемую навигационную панель для UINavigationController
  • Текущий контроллер Modal View в верхней части UINavigationController
  • Поворот UIWebView: принудительный пейзаж
  • UINavigationController прокручивается по кнопке «Назад»
  • Любой способ представить панель навигации для UIImagePickerController, тип источника UIImagePickerControllerSourceTypeCamera, в iOS 7?
  • Как быть предупрежденным, когда uiviewcontroller выталкивается / выталкивается из стека навигации
  • Контроллер навигации без кнопки «Назад»
  • Как изменить название кнопки на навигационном контроллере в swift3?
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.