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

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

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

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

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

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

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

Нет стандартного подхода, потому что это поведение не рекомендуется 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.

  • Настроить панель навигации, добавив две метки вместо названия в Swift
  • Панель состояния скрытия панели навигации
  • Странное поведение NavigationBar после нескольких нажатий и pop с анимацией NO. IOS 7
  • Как вы сразу видите модальный вид и предыдущий вид контроллера навигации?
  • Перемещение между подробными представлениями дочернего узла в представлении родительской таблицы
  • Передача данных с помощью кнопки навигации
  • переход в корневой режим в контроллере навигации
  • Заголовок Шрифт не изменяется на панели навигации
  • Встроенная кнопка обратной связи UINavigationController не работает
  • Получение черного экрана при использовании панели вкладок при поиске с помощью SearchController
  • Нажатие кнопки назад (backBarButtonItem) в KIF?
  • Interesting Posts

    Изображение на стене Facebook и стене Facebook

    Стандартная смена батареи службы обслуживания на iOS

    Как изменить текущую страницу для учебника UIScrollView от Ray Wenderlich?

    Можно ли изменить звуковую метку экрана блокировки iOS 8 при воспроизведении из Интернета?

    Создание пользовательской международной клавиатуры для iPhone

    Swift NSTimer непризнанный селектор, отправленный на экземпляр timerFireMethod

    Что вызвало этот журнал сбоев в iPhone?

    ошибка в gdata-objectivec-client api + oauth2 ios framework

    Как я могу получить время и рейтинг пользователей для определенной таблицы лидеров и игр из Game Center?

    кто выпускает мою UIKeyboardDidHideNotification?

    Второе касание iOS никогда не запускает UIControlEventTouchUpInside

    iOS Swift: как проверить, существует ли объект в массиве, поэтому я не добавляю его в него или не создаю с ним GMSMarker?

    Как получить уведомление для подписки на автоматическое продление с помощью RMStore в iOS

    литье NSInteger в NSString

    iOS: Как получить текущую настройку языка устройства?

    Давайте будем гением компьютера.