7

Necesito hacer ciertas cosas cuando mi controlador de vista es empujado o extraído de la pila de navegación, pero no quiero usar viewillappear/viewdidappear o viewwill desaparecer/viewdid desaparecer ya que esos casos cubren además cuando el controlador de vista es empujado/reventado. Es la forma correcta de hacerlo para usar el delegado de navigationcontroller y el navigationController: didShowViewController: animated: y navigationController: willShowViewController: animated:? Si no, ¿cómo es la mejor manera de hacerlo?Cómo recibir una alerta cuando uiviewcontroller es empujado/extraído de la pila de navegación

Respuesta

7

Para saber cuando es empujado, se puede utilizar el

UINavigationControllerDelegate

e implementar

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

Este método se disparará cuando el viewcontroller se empuja en la pila de navegación, y cada vez que el controlador de vista en la parte superior se apaga, lo revela de nuevo. Entonces, debes usar una bandera para descubrir si se ha inicializado aún, si no es así, significa que simplemente se presionó.

Para saber cuando ha sido apareció, utilice esta respuesta:

viewWillDisappear: Determine whether view controller is being popped or is showing a sub-view controller

6

Puede probar los métodos delegados UINavigationController que llama cuando el objeto empuja o extrae desde la pila del controlador de navegación.

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

siempre puede crear una subclase simple de los UINavigationController y envolver los métodos de su superclase de manera que se establece una bandera antes de llamar a ellos:

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 

Como pushing evaluará a NO evento si no pasa nada, se espera que este código para acceder desde el UINavigationControllerDelegate.

2

He aquí un ejemplo para detectar cuando un controlador de vista se inserta en la pila de navegación anulando -viewWillAppear: y se metió anulando -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

'Overriding' es un tanto mejor palabra. – noob

0

Usted puede hacer algo así en willShowViewController

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { 
    if self.navigationController!.viewControllers.contains(self){ 
     print ("push") 
    } else { 
     print ("pop") 
    } 
} 
0

Tenga cuidado de usar

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

Si golpe de usuario desde el borde hacia la derecha para hacer estallar controlador de vista (y en realidad no lo pop), se invocará por encima de la función de delegado, pero no por debajo de la función

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

Por favor refiérase a https://gist.github.com/nonamelive/9334458

Cuestiones relacionadas