Подтвердить что ты не робот

Выясните, нажал ли пользователь кнопку "Назад" в контроллере uinavigation?

Когда загружается представление, я хочу увидеть, было ли это, потому что пользователь нажал кнопку "Назад". Как я могу это проверить?

4b9b3361

Ответ 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. Вы можете играть с ним так, как хотите.

Ура!