2012-01-23 10 views

Odpowiedz

15

Szybkim rozwiązaniem jest dodanie implementacji metody viewWillDisappear:. Zostanie on uruchomiony, gdy tylko zniknie viewController w odpowiedzi na naciśnięcie przycisku wstecz.

- (void)viewWillDisappear:(BOOL)animated { 
    //... 
    //make you stuff here 
    //... 
} 

Innym rozwiązaniem jest dodanie niestandardowego respondenta do przycisku Wstecz. Można zmodyfikować metodę startowy Twojego viewController jest następująca:

- (id)init { 
    if (self = [super init]) { 
     //other your stuff goes here 
     //... 
     //here we customize the target and action for the backBarButtonItem 
     //every navigationController has one of this item automatically configured to pop back 
     self.navigationItem.backBarButtonItem.target = self; 
     self.navigationItem.backBarButtonItem.action = @selector(backButtonDidPressed:); 
    } 
    return self; 
} 

a następnie można użyć metody wyboru jak poniżej. Pamiętaj, aby poprawnie odrzucić viewController, w przeciwnym razie kontroler nawigacji nie wyświetli się zgodnie z oczekiwaniami.

- (void)backButtonDidPressed:(id)aResponder { 
    //do your stuff 
    //but don't forget to dismiss the viewcontroller 
    [self.navigationController popViewControllerAnimated:TRUE]; 
} 
+4

Jedna różnica między nimi polega na tym, że pierwsze rozwiązanie (to jest "viewWillDisappear") jest wywoływane podczas przechodzenia wstecz lub do przodu przez stos nawigacyjny. Drugie rozwiązanie jest po prostu na powrót. – Matthew

+5

To zwykle nie działa, ponieważ okaże się, że backBarButtonItem jest zerowe, chyba że wyraźnie przypiszesz do niego przycisk. W moim doświadczeniu i tak, zarówno leftBarButtonItem i backBarButtonItem były zerowe. – Diziet

+3

to nie działa –

1

Najprostszym sposobem byłoby umieszczenie kodu w ViewController, który zostanie wyświetlony po naciśnięciu przycisku Wstecz. Można użyć viewWillAppear

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    //Your code here 
} 

pamiętać, że ta będzie również wykonywane, gdy widok jest przedstawiony z jakiegokolwiek innego powodu, więc jeśli chcesz to się zdarzyć tylko wtedy, gdy przycisk Wstecz jest wciśnięty trzeba użyć delegata: UINavigationControllerDelegate

+0

że metoda zostanie wywołana, kiedy to pojawia się w ogóle vc, niekoniecznie tylko w wyniku właśnie wraca do niego – Colin

+1

@Colin że jest poprawna, to zależy od dokładnego zachowania chce, on może użyć delegata, jeśli chce go tylko, gdy zostanie naciśnięty przycisk Wstecz. –

6
UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 52, 31)]; 
[backButton setBackgroundImage:[UIImage imageNamed:@"BackButton.png"] forState:UIControlStateNormal]; 
//[backButton setTitle:@"CLOSE" forState:UIControlStateNormal]; 
[backButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 
[backButton.titleLabel setFont:[UIFont boldSystemFontOfSize:14.0f]]; 
[backButton addTarget:self action:@selector(tappedBackButton:) forControlEvents:UIControlStateHighlighted]; 

UIBarButtonItem* item = [[UIBarButtonItem alloc] initWithCustomView:backButton]; 

self.navigationItem.leftBarButtonItem = item; 
[item release]; 

Tworzenie niestandardowego Wstecz i stosując że selektor wywołania metody, które chcesz. A także użyj [self.navigationController popViewControllerAnimated: TRUE];

- (void)tappedBackButton:(id)button 
{ 
    // call your method here 
    [self.navigationController popViewControllerAnimated:TRUE]; 
} 
+0

Należy pamiętać, że po wymianie przycisku Wstecz w ten sposób, utracisz "przesunięcie z lewej krawędzi, aby powrócić do funkcji rodzica viewController", która została wprowadzona w iOS 7 i jest przydatna skrót na iPhone 6 i 6+ –

+0

Nie działa z self.navigationItem.rightBarButtonItem ... Podaj inne rozwiązanie – Vidhi

6

Chyba znalazłem „czysty” sposób, aby to zrobić:

Najpierw ustaw kontroler widoku za zgodne z protokołem UINavigationControllerDelegate

@interface MyViewController() <UINavigationControllerDelegate> 

Następnie należy zdefiniować go jako delegata

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

    // Set this View Controller as the navigation controller delegate 
    self.navigationController.delegate = self; 

} 

Na koniec użyj tej metody z UINavigationControllerDeleg zjadł protokół:

#pragma mark - Navigation controller delegate 
- (void)willMoveToParentViewController:(UIViewController *)parent 
{ 
    // If there is no parent, then it means that the view controller has been removed from the stack, which happens when the back button has been pressed 
    if (!parent) { 
     NSLog(@"Back button pressed"); 

     // it can be useful to store this into a BOOL property 
     self.backButtonPressed = YES; 
    } 
} 
Powiązane problemy