2011-01-07 16 views
5

W mojej aplikacji mam podstawowy kontroler nawigacyjny. Dla wszystkich moich widoków, z wyjątkiem jednego, kontroler działa tak, jak powinien.iPhone: Jak zastąpić przycisk Wstecz w kontrolerze nawigacyjnym?

Jednakże, w szczególności dla jednego widoku, chciałbym, aby przycisk "wstecz" nie wracał do poprzedniego widoku, ale aby przejść do poprzedniego, które ustawiłem. W szczególności cofnie się o 2 odsłon i pominie jeden.

Po wykonaniu niektórych badań odkryłem, że mogę przechwycić pogląd kiedy znika, więc starałem się umieścić w kodzie mieć to przejdź do strony Chciałbym:

- (void)viewWillDisappear:(BOOL)animated { 
[super viewWillDisappear:animated]; 
//i set a flag to know that the back button was pressed 
if (viewPushed) { 
    viewPushed = NO; 
} else { 
    // Here, you know that back button was pressed 
    mainMenu *mainViewController = [[mainMenu alloc] initWithNibName:@"mainMenu" bundle:nil]; 
    [self.navigationController pushViewController:mainViewController animated:YES]; 
    [mainViewController release]; 
} 

}

To nie zadziałało, więc czy ktoś ma jakieś pomysły?

Dzięki!

Odpowiedz

12

W twoim kodzie, wydajesz się próbować przesuwać inny kontroler widoku na stos, zamiast wysuwać z niego dodatkowy element.

Spróbuj to jako kod, który robi sięgające dwa poziomy:

NSArray *vcs = [self.navigationController viewControllers]; 
[self.navigationController popToViewController:[vcs objectAtIndex:[vcs count]-3]; 

Ewentualnie można całkowicie zastąpić przycisk wstecz za pomocą przycisku na własną rękę? W swojej viewController:

UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(doSomething:)]; 

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

Następnie można napisać doSomething: Metoda pop dwa elementy ze stosu, być może przy użyciu kodu napisałem powyżej.

+0

Jak na razie działa świetnie! Dziękuję za odpowiedź!! Udało mi się utworzyć przycisk niestandardowy, utworzyć metodę i zbudować tablicę z listą otwartych widoków. Jednak pojawia się błąd "nieprzechodni wyjątku", gdy przekraczam linię popToViewController ... Próbowałem nawet tego: [self.navigationController popToViewController: [vcs objectAtIndex: 1]]; bez skutku. Obecnie badam więcej o popToViewController. –

+0

Skończyło się na użyciu: [self.navigationController popToViewController: [self.navigationController.viewControllers objectAtIndex: 0] animated: YES]; wrócić dwa poziomy .. działa świetnie, więc dziękuję! –

+0

Jeśli chcesz wrócić do najwyższego poziomu, to popToRootViewControllerAnimated: powinno działać. –

2

Możesz spróbować wdrożyć delegata UINavigationBarDelegate. Gdy wywoływana jest metoda -navigationBar:didPopItem:, możesz dodać dodatkowy element z UINavigationController, a tym samym wysyłać dwa elementy naraz.

+0

to jest bardziej lub mniej sposób zastąpić metodę UINavigationController popViewControllerAnimated np aby potwierdzić nawigację wstecz. Z tą różnicą, że musisz zaimplementować opcję - (BOOL) navigationBar: (UINavigationBar *) navigationBar shouldPopItem: (UINavigationItem *) Metoda pozycji UINavigationBarDelegate. –

3

Proste rozwiązanie:

- (void)viewWillDisappear:(BOOL)animated { 
    //if true, back was pressed 
    if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) { 
      //your logic 
    } 
} 
+0

Czyste rozwiązanie.praca na iOS 9. dziękuję –

+0

Co zrobić, jeśli chcę sprawdzić stan przed powrotem do nawigacji i jeśli ten warunek nie powiedzie się, a następnie chcę go zatrzymać, aby wrócić. znasz Windows lub Android, a następnie chcę coś takiego jak e.handled = true; – Yawar

-1
UIButton *home = [UIButton buttonWithType:UIButtonTypeCustom]; 
UIImage *homeImage = [UIImage imageNamed:@"back.png"]; 
[home setBackgroundImage:homeImage forState:UIControlStateNormal]; 
[home addTarget:self action:@selector(LogOut) 
forControlEvents:UIControlEventTouchUpInside]; 
home.frame = CGRectMake(0, 0, 69, 26); 
UIBarButtonItem *button2 = [[UIBarButtonItem alloc] initWithCustomView:home]; 
[[self navigationItem] setLeftBarButtonItem:button2]; 
[button2 release]; 
button2 = nil; 
Powiązane problemy