Я должен сказать, что это один из распространенных вариантов использования, который Apple, кажется, не облегчает, и я вижу много усилий, пытаясь заставить это работать. Я подумал, что, может быть, мне следует обобщить мои выводы здесь.
Как отмечали многие, метод, описанный ниже в UINavigationBarDelegate
, является ключом к реализации этой функции.
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item;
Многие из них имеют подклассы UINavigationController
и реализовали описанный выше метод для упрощения использования без прямого доступа к UINavigationBar
.
К сожалению, остаются некоторые проблемы.
- Жест смахивания назад не вызывает этот метод.
- Хотя кажется необходимым, о сбоях сообщается, вызывая
popViewControllerAnimated:
в этом методе.
- Кнопка «Назад» остается серой при отмене всплывающих окон.
Проведите назад жестом
Нам нужно перехватить жест, установив делегата, как это сделано в https://stackoverflow.com/a/23173035/2400328.
Если UINavigationController
находится в подклассах, это будет:
self.interactivePopGestureRecognizer.delegate = self
и реализации:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
Будьте внимательны при изменении свойства делегата, поскольку оно изменяется после вызова инициализатора.
Не звонит popViewControllerAnimated:
Несмотря на то, что без документов, можно позвонить на popViewControllerAnimated:
, как в https://stackoverflow.com/a/26084150/2400328.
Это включает вызов navigationBar:shouldPopItem:
из UINavigationController
(из подкласса).
Кнопка Назад
Хотя это может быть незначительной деталью (особенно если вы разработали свою собственную кнопку «Назад»), есть простое решение (написанное мной :) https://stackoverflow.com/a/29440633/2400328
Вам нужно только установить свойство YES и NO.
auto item = navigationBar.topItem;
item.hidesBackButton = YES;
item.hidesBackButton = NO;