Узнайте, если пользователь нажал кнопку "Назад" в uinavigationcontroller?


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

7 61

7 ответов:

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

лучшее решение, которое я нашел для обнаружения кнопки возврата 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's 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
}

в viewWillDisappear метод проверки

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    if ([self isMovingFromParentViewController]) {
      //specific stuff for being popped off stack
    }
}

Это только для post iOS 5

UINavigationController имеет delegate свойство, которое выдает обратные вызовы делегата. Пожалуйста, смотрите ссылка на iOS здесь.

у делегата нет обратного вызова "назад нажата кнопка", но вместо этого он сообщает вам, когда что-то появится в стеке навигации. Когда вы нажимаете назад, вы" выталкиваете " контроллер верхнего вида из стека, поэтому он сообщит вам, что представление вот-вот появится. Я думаю, что это обратный вызов вы бы искали для.

вы можете иметь некоторую простую логику, чтобы проверить, если это контроллер вида, который "заинтересован", а затем вы можете отправить уведомление и т. д.

для полноты картины, смешайте два самых популярных ответа (1,2) в Swift:

override func willMoveToParentViewController(parent: UIViewController?) {
    super.willMoveToParentViewController(parent)
    if parent == nil {
        // view controller is popping
    }
}

Это немного другой сценарий, но я думал, что решение может помочь другим из.

в моей ситуации у меня был UINavigationController в UIPopoverController. Мне нужно было определить, нажал ли пользователь кнопку "Назад" или щелкнул за пределами popover. Для этого я проверил свойство visibleViewController в viewWillDisappear. Если контроллер вида по-прежнему является visibleViewController при закрытии, то popover закрывается другим способом. Если контроллер вида не является visibleViewController при закрытии, затем была нажата кнопка Назад.

- (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>
    }
}

Я попытался использовать решение Зака, но isMovingFromParentViewController возвращает true для обоих случаев.

Я проверил, что это работает в iOS 5+

Я надеюсь, что это помогает.

создать пользовательскую кнопку назад и цели,

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

Ура!