Когда загружается представление, я хочу увидеть, было ли это, потому что пользователь нажал кнопку "Назад". Как я могу это проверить?
Выясните, нажал ли пользователь кнопку "Назад" в контроллере uinavigation?
Ответ 1
Единственный способ сделать это, чтобы вы точно знали, что это была кнопка "Назад", чтобы создать пользовательскую кнопку. Если вы не знаете, как это сделать, ознакомьтесь с этим учебником. Он не будет похож на обычную кнопку "назад", но будет закрыт. Если вам нужна дополнительная помощь, напишите комментарий
Ответ 2
Лучшее решение, которое я нашел для обнаружения нажатия кнопки UINavigationController назад (pre-iOS 5.0), - это проверка того, что текущий контроллер просмотра отсутствует в стеке контроллера контроллера навигации.
Возможно, безопаснее проверить это условие в - (void)viewDidDisappear:(BOOL)animated
как логически, к моменту вызова этого метода было бы крайне вероятно, что диспетчер представлений был удален из стека.
Pre-iOS 5.0:
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
if (![[self.navigationController viewControllers] containsObject:self]) {
// We were removed from the navigation controller view controller stack
// thus, we can infer that the back button was pressed
}
}
iOS 5.0+ вы можете использовать - didMoveToParentViewController:
- (void)didMoveToParentViewController:(UIViewController *)parent
{
// parent is nil if this view controller was removed
}
Ответ 3
в вашем режиме проверки проверкиWillDisappear
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if ([self isMovingFromParentViewController]) {
//specific stuff for being popped off stack
}
}
Это только для пост iOS 5
Ответ 4
UINavigationController имеет свойство delegate
, которое выдает обратные вызовы делегатов. См. ссылку iOS здесь.
Делегат не имеет обратного вызова "назад", но вместо этого он сообщает вам, когда что-то появится в стеке навигации. Когда вы нажимаете "назад", вы "выталкиваете" контроллер верхнего уровня со стека, поэтому он скажет вам, что появится представление. Я думаю, что это обратный вызов, который вы ищете.
У вас может быть некоторая простая логика, чтобы проверить, является ли это контроллером представления "заинтересованным", а затем вы можете отправить уведомление и т.д.
Ответ 5
Это немного другой сценарий, но я думал, что решение может помочь другим.
В моей ситуации у меня был UINavigationController внутри UIPopoverController. Мне нужно было определить, нажал ли пользователь кнопку "Назад" или щелкнул за пределами popover. Для этого я проверил свойство visibleViewController в viewWillDisappear. Если контроллер просмотра по-прежнему остается видимым элементом управления при закрытии, то popover закрывается другим способом. Если при закрытии контроллер просмотра не является видимымПросмотром, то была нажата кнопка "Назад".
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if (self.navigationController.visibleViewController != self) {
<Do something since we're closing using something else>
} else {
<Do something since we're closing because of the back button>
}
}
Я попытался использовать zach-решение, но isMovingFromParentViewController возвращает true для обоих случаев.
Я подтвердил, что это работает в iOS 5 +
Надеюсь, это поможет.
Ответ 6
Для полноты, смешивания двух наиболее распространенных ответов (1, 2) в Swift:
override func willMoveToParentViewController(parent: UIViewController?) {
super.willMoveToParentViewController(parent)
if parent == nil {
// view controller is popping
}
}
Ответ 7
Создайте пользовательскую кнопку на задней панели и установите цель,
Шаг 1: добавьте эти методы в свой класс
- (void)backButtonClicked :(id)sender{
[self.navigationController popViewControllerAnimated:YES];
}
- (void)addBackBarButton{
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 0, 55, 35);
[button setTitle:@"back" forState:UIControlStateNormal];
[button addTarget:self action:@selector(backButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button];
self.navigationItem.leftBarButtonItem = customBarItem;
}
Шаг 2: Вызов [self addBackBarButton]; в режиме viewDiDLoad
Вы получите действие в backButtonClicked. Вы можете играть с ним так, как хотите.
Ура!