7

Potrzebuję wykonać pewne czynności, gdy mój kontroler widoku jest zarówno popychany, jak i wyskakiwany z poziomu stosu nawigacji, ale nie chcę używać widoku/widokuapid/viewdilldisappear/viewdiddisappear ponieważ obejmują one przypadki poza tym, kiedy kontroler widoku jest popychany/popping. Czy jest to właściwy sposób, aby użyć tego, aby użyć delegata nawigacjacontroller i navigationController: didShowViewController: animated: i navigationController: willShowViewController: animated:? Jeśli nie, w jaki sposób najlepiej to osiągnąć?Jak zostać ostrzeżonym, kiedy kontroler uiviewclipler jest pchnięty/wyskakuje ze stosu nawigacji

Odpowiedz

7

Aby dowiedzieć się, kiedy jest wciśnięty, można użyć

UINavigationControllerDelegate

i wdrożenie

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

Ta metoda zadziała gdy viewcontroller jest wpychana do stosu nawigacji i za każdym razem, gdy kontroler podglądu na górze jest wyskakiwany, co ujawnia go ponownie. Musisz więc użyć flagi, aby dowiedzieć się, czy została ona jeszcze zainicjowana, jeśli nie oznacza to, że została po prostu wypchnięta.

Aby dowiedzieć się, kiedy to zostało pojawiło użyć tej odpowiedzi:

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

6

Możesz wypróbować metody delegatów UINavigationController, które wywołują, gdy obiekt zostanie naciśnięty lub pop ze stosu kontrolera nawigacyjnego.

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

Zawsze można stworzyć prosty podklasę UINavigationController i owinąć metody nadklasy, tak aby ustawić flagę przed nazywając je:

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 

Jak pushing oceni do NO przypadku jeśli nic się nie dzieje, oczekuje się, że kod ten należy uzyskać od UINavigationControllerDelegate.

2

Oto przykład wykryć, gdy kontroler widoku jest pchany na stosie nawigacji nadrzędnymi -viewWillAppear: i trzasnął nadrzędnymi -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' jest znacznie lepsze słowo. – noob

0

można zrobić coś takiego w willShowViewController

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

Zachowaj ostrożność, aby użyć

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

Jeśli machnięcia użytkownik od krawędzi do prawej dla popping widoku kontrolera (a nie faktycznie pop go), będzie powoływać powyżej funkcji delegata ale nie poniżej funkcji

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

Proszę odnieść się do https://gist.github.com/nonamelive/9334458

Powiązane problemy