7

Ho bisogno di fare certe cose quando il mio controller di visualizzazione è sia spinto o scoppiato dallo stack di navigazione, ma non voglio usare viewillappear/viewdidappear o viewwilldisappear/viewdiddisappear poiché questi coprono i casi oltre a quando il controller della vista viene premuto/scoppiato. È il modo corretto per utilizzare questa funzionalità per utilizzare il delegato navigationcontroller e il navigationController: didShowViewController: animated: and navigationController: willShowViewController: animated:? In caso contrario, qual è il modo migliore per farlo?Come essere avvisati quando uiviewcontroller viene premuto/scoppiato dallo stack di navigazione

risposta

7

Per sapere quando è premuto, è possibile utilizzare il

UINavigationControllerDelegate

e implementare

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

Questo metodo si attiverà ogni volta che il viewcontroller viene spinto nella pila di navigazione, e ogni volta che il viewcontroller su di esso viene saltato fuori, rivelando di nuovo. Quindi devi usare un flag per capire se è stato ancora inizializzato, se non lo è significa che è stato appena spinto.

Per sapere quando è stato spuntato, utilizzare questa risposta:

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

6

È possibile provare i metodi delegati di UINavigationController che chiama quando l'oggetto push o pop dallo stack del controller di navigazione.

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

si può sempre creare un semplice sottoclasse della UINavigationController e avvolgere i metodi del suo superclasse in modo che si imposta una bandiera prima di chiamare:

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 

Come pushing valuterà a NO evento se non accade nulla, questo codice dovrebbe essere accessibile dalla UINavigationControllerDelegate.

2

Ecco un esempio per rilevare quando un controller di vista è stato inserito nello stack di navigazione sovrascrivendo -viewWillAppear: e spuntato l'override -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' è un molto più parola migliore – noob

0

Si può fare qualcosa di simile in willShowViewController

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

Fai attenzione a usare

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

Se scorri utente dal bordo in giusto per popping View Controller (e non in realtà pop), si invocherà sopra la funzione del delegato, ma non al di sotto funzione

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

Si prega di fare riferimento al https://gist.github.com/nonamelive/9334458

Problemi correlati