Изменение стека UINavigationController с помощью контроллеров модального просмотра
У меня есть следующая среда:
- контроллер корневого представления – UINavigationController
- несколько пользовательских UIViewControllers могут быть перенесены в стек навигации
- каждый из пользовательских контроллеров может или не может представлять собой контроллер модального представления
- Мне нужно иметь возможность программно управлять стеком навигации (например, удалять все контроллеры из стека навигации, кроме корневого контроллера, в ответ на какое-то внешнее событие, такое как доставка push-уведомлений)
Наивная реализация с помощью [navigationController setViewControllers:newControllers animated:animated];
очевидно, терпит неудачу, если есть контроллер модального представления, представленный любым из старых контроллеров в стеке:
- Как добавить правую кнопку в UINavigationController?
- Swift: как закрыть контроллер просмотра и контроллер навигации, запущенный с AppDelegate
- Исчезающий UISearchController в TableViewController, который находится в UINavigationController
- Как сохранить состояние UISearchDisplayController?
- Используйте панель вкладок с подсветкой MVVM (iOS)
- Этот модальный контроллер остается видимым
- Если шаблон распределения используется для передачи родительских <-> модальных контроллеров (родитель является делегатом представленного контроллера модального представления), любое действие в контроллере модального представления приводит к сбою, поскольку делегат уже был выпущен
Поэтому общая проблема заключается в том, что жизненный цикл модального контроллера не связан с родительским контроллером. Мои вопросы:
- Существует ли метод stardard для управления такой иерархией и безопасными изменениями в стеке навигации?
- Если НЕТ, чем была бы лучшая пользовательская реализация? Я вижу два общих подхода: один заключается в том, чтобы явно отклонить / отменить привязку всех модальных контрейлеров к коду, изменяющему стек навигации, а другой – добавить логику в консоль родительского представления для управления жизненным циклом модальных контроллеров напрямую.
- Невозможно установить название UINavigationItem
- Ошибка утверждения в void _UIPerformResizeOfTextViewForTextContainer
- iOS Push Navigation Controller, без панели на втором экране
- Как нажать viewController перед тем, как отклонить контроллер модального просмотра с помощью раскадровки?
- Как добавить UIBarButtonItem в NavigationBar при использовании UIPageViewController
- Как скрыть прямую кнопку на навигационном контроллере с быстрым
- Приложение iOS замерзает на PushViewController
- Есть ли способ изменить высоту UINavigationBar в Storyboard без использования UINavigationController?
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.