Как получить уведомление, когда uiviewcontroller выдвигается / выталкивается из стека навигации - PullRequest
7 голосов
/ 11 января 2012

Мне нужно делать определенные вещи, когда мой контроллер вида и выталкивается, или извлекается из стека навигации, но я не хочу использовать viewillappear / viewdidappear или viewwilldisappear / viewdiddisappear, поскольку эти случаи охватывают, кроме случаев, когда контроллер представления нажат или выдвинут , Правильный ли способ сделать это, используя делегат navigationcontroller и navigationController: didShowViewController: animated: и navigationController: willShowViewController: animated:? Если нет, то как лучше всего это сделать?

Ответы [ 6 ]

7 голосов
/ 12 января 2012

Чтобы узнать, когда он выдвинут, вы можете использовать

UINavigationControllerDelegate

и реализовать

- (void)navigationController:(UINavigationController *)navigationController 
      willShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated

Этот метод будет запускаться всякий раз, когда viewcontroller помещается встек навигации и всякий раз, когда верхний видовой контроллер сбрасывается, открывая его снова.Таким образом, вы должны использовать флаг, чтобы выяснить, был ли он еще инициализирован, если у него нет, значит, он просто был нажат.

Чтобы узнать, когда он был извлечен, используйте этот ответ:

viewWillDisappear: определить, выталкивается ли контроллер вида или показывает контроллер подвидом

6 голосов
/ 11 января 2012

Вы можете попробовать методы делегата UINavigationController, которые он вызывает при выталкивании или выталкивании объекта из стека контроллера навигации.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
2 голосов
/ 12 мая 2015

Вот пример для определения, когда контроллер представления помещается в стек навигации путем переопределения -viewWillAppear: и извлечения путем переопределения -viewWillDisappear:

-(void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
    if (self.isMovingToParentViewController) {
        NSLog(@"view controller being pushed");        
    }
}

-(void) viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
    if (self.isMovingFromParentViewController) {
        NSLog(@"view controller being popped");
    }
}
1 голос
/ 19 декабря 2017

Будьте осторожны, чтобы использовать

- (void)navigationController:(UINavigationController *)navigationController 
  willShowViewController:(UIViewController *)viewController
                animated:(BOOL)animated

Если пользователь проведет пальцем от края к праву для всплывающего окна просмотра контроллера (и фактически не вытолкнет его), он вызовет функцию выше делегата, но не ниже функции

- (void)navigationController:(UINavigationController *)navigationController 
   didShowViewController:(UIViewController *)viewController 
                animated:(BOOL)animated;

Пожалуйста, обратитесь к https://gist.github.com/nonamelive/9334458

1 голос
/ 23 сентября 2014

Вы всегда можете создать простой подкласс UINavigationController и обернуть методы его суперкласса, чтобы установить флаг перед их вызовом:

ActionNavigationController.h

#import <UIKit/UIKit.h>

@interface ActionNavigationController : UINavigationController
@property (nonatomic, readonly) BOOL pushing;
@end

ActionNavigationController.m

#import "ActionNavigationController.h"

@implementation ActionNavigationController
@synthesize pushing = _pushing;

-(void)pushViewController:(UIViewController *)viewController 
                 animated:(BOOL)animated {
    _pushing = YES;
    [super pushViewController:viewController animated:animated];
}

- (UIViewController *)popViewControllerAnimated:(BOOL)animated {
    _pushing = NO;
    return [super popViewControllerAnimated:animated];
}
- (NSArray *)popToViewController:(UIViewController *)viewController 
                        animated:(BOOL)animated {
    _pushing = NO;
    return [super popToViewController:viewController animated:animated];
}
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated {
    _pushing = NO;
    return [super popToRootViewControllerAnimated:animated];
}

@end

Поскольку pushing оценивает событие NO, если ничего не происходит, ожидается, что этот код будет доступен из UINavigationControllerDelegate.

0 голосов
/ 04 апреля 2016

Вы можете сделать что-то подобное в willShowViewController

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
    if self.navigationController!.viewControllers.contains(self){
        print ("push")
    } else {
        print ("pop")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...