2011-11-05 6 views
6

Może to zabrzmieć pytanie początkujących, ale jestem nowy t iOS dev.Zmiana navigationController.delegate powoduje zły dostęp

Mam widok wciśnięty w navigationController, powiedzmy, że jest to trzeci widok. W tym widoku ustawiłem self.navigationController.delegate = self;. Zmieniono delegata, ponieważ potrzebuję obsługiwać przypadek, gdy użytkownik przechodzi do poprzedniego widoku, tj. Wyskakuje z bieżącego widoku.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    if ([[viewController class] isEqual:[MainViewController class]]) { 
     ... 
    } 
} 

To działa OK, ale kiedy ponownie pojawi przycisk bieżącego widoku i przycisk nawigacyjny z powrotem (czyli przejście na pierwszy pchnął zobaczyć) Dostaję błąd dostępu złe.

Czego mi brakuje? Jaki jest właściwy sposób obsługi przycisku wstecznego przycisku nawigacji?

Odpowiedz

3

To dlatego, że kontroler nawigacyjny wysyła komunikat do sterowanego kontrolera podglądu i zwalniania, musisz ustawić delegata za każdym razem, gdy robisz popping i push. Dodaj także self.navigationController.delegate = nil; do dealloc metody swojego viewController.

+0

faktycznie ustawienie delegata do zera w dealloc nie pomogło ... W moim przypadku, 3. Widok realizuje UINavigationControllerDelegate się inni nie ? Więc gdzie muszę ustawić delegata na siebie, we wszystkich widokach? – deimus

+1

Jeśli mam cię poprawnie delegować, powinieneś ustawić zero w widoku, gdzie jeśli był ustawiony na siebie za każdym razem, gdy będziesz naciskać lub pop. Przynajmniej tak zrobiłem i wygląda na to, że ... Proszę potwierdzić – deimus

+0

Oczywiście trzeba to ustawić dla każdego kontrolera widoku. Potwierdzać. Powodem, dla którego powinieneś ustawić delegację na zero, jest unikanie "zwisających" wskaźników (wskaźników do zwalnianej pamięci). EXC_BAD_ACCESS zwykle dzieje się, gdy wysyłasz komunikat do dealokowanego obiektu, a ponieważ delegat kontrolera nawigacji był zdekalokowanym obiektem, do którego dostałeś ten błąd. – Eugene

0

Place poniżej w Viewcontroller w którym przypisywanie self.navigationController.delegate = własnym

-(void) viewWillDisappear:(BOOL) animated 
{ 
    [super viewWillDisappear:animated]; 
    if ([self isMovingFromParentViewController]) 
    { 
     if (self.navigationController.delegate == self) 
     { 
      self.navigationController.delegate = nil; 
     } 
    } 
} 
Powiązane problemy