2012-01-18 16 views
5

Potrzebuję pomocy w rozwiązaniu problemu z kontrolerami nawigacyjnymi.popToRootViewControllerAnimated nie wyświetla kontrolera widoku root

Mam navigationController z naciskiem 4 ViewControllers. Ostatnie vc I push prezentuje modulację w postaci kolejnego ViewController. Modal ViewController przedstawia ActionSheet. W zależności od odpowiedzi użytkownika albo odrzuciam tylko modalny ViewController lub chcę powrócić do katalogu głównego ViewController.

W ViewController prezentowanym modally mam:

- (void) dismissGameReport 
{  
    [[self delegate] GameReportModalWillBeDismissed:modalToPopToRoot];  
} 

W ostatnim ViewController nasunąć navigationController stosie mam:

- (void)GameReportModalWillBeDismissed: (BOOL)popToRoot; 
{  
    if (popToRoot) 
     { 
     [self.navigationController popToRootViewControllerAnimated:NO]; 
     } 
    else 
     { 
     [self dismissModalViewControllerAnimated:YES]; 
     }    
} 

Lekceważenie zdania modalne kontroler działa dobrze. Jednak

[self.navigationController popToRootViewControllerAnimated:NO]; 

nie powoduje korzeń ViewController aby wyświetlić jego poglądy. Dodawanie informacji o dzienniku Widzę, że po komunikacie do self.navigationController stos jest prawidłowo wyskakujący, ale wykonanie jest kontynuowane sekwencyjnie. Ekran nadal pokazuje widok modalnego ViewController.

Jako obejście problemu próbowałem zawsze odwoływać kontroler widoku modalnego, a w metodzie ViewWillAppear mieć komunikat popToRootAnimated. Bez różnicy. Nadal stos kontrolek jest wysuwany, ale ekran nadal pokazuje widok kontrolera widoku modalnego, a wykonanie jest kontynuowane sekwencyjnie.

Czy ktoś może mi pomóc?

+0

czy próbujesz debugować z punktem przerwania, w którym twój kompilator wchodzi do pętli? – Hiren

Odpowiedz

6

Podobają mi się te oszukańcze pytania. Wydaje się to bardzo proste, dopóki nie spróbujesz tego zrobić.

To, co znalazłem, to to, że musisz odrzucić ten kontroler widoku modalnego, ale jeśli spróbujesz wyskoczyć z kontrolera nawigacyjnego na następnej linii, wszystko się pomieszało. Musisz upewnić się, że odwołanie się zakończyło przed próbą pop. W systemie iOS 5 można użyć numeru dismissViewControllerAnimated:completion:.

-(void)GameReportModalWillBeDismissed:(BOOL)popToRoot{  
    if (popToRoot){ 
     [self dismissViewControllerAnimated:YES completion:^{ 
      [self.navigationController popToRootViewControllerAnimated:YES]; 
     }]; 
    } 
    else{ 
     [self dismissModalViewControllerAnimated:YES]; 
    }    
} 

Ale widzę, że masz 4,0 w swoich tagach z pytaniami. Rozwiązanie, które znalazłem dla <iOS 5 jest o wiele mniej ładne, ale powinno nadal działać, i brzmi, jakbyś był już na szlaku. Chcesz viewDidAppear:, a nie viewWillAppear:. Moje rozwiązanie tutaj wiąże się ivar, powiedzmy:

BOOL shouldPopToRootOnAppear; 

I wówczas GameReportModalWillBeDismissed: będzie wyglądać mniej więcej tak:

-(void)GameReportModalWillBeDismissed:(BOOL)popToRoot{  
    shouldPopToRootOnAppear = popToRoot; 
    [self dismissModalViewControllerAnimated:YES];   
} 

A twój viewDidAppear: wyglądałby następująco ...

-(void)viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 
    if (shouldPopToRootOnAppear){ 
     [self.navigationController popToRootViewControllerAnimated:YES]; 
     return; 
    } 
    // Normal viewDidAppear: stuff here 
} 
+0

witam. Wspaniały !!! To działało jak czar. Dziękuję bardzo, to było więcej niż 4 dni, kiedy bawiłem się moim kodem. Dzięki jeszcze raz. – DanL

+0

Witamy w stackoverflow.com. Miło, że mogłem pomóc. Jeśli ta odpowiedź rozwiązała Twój problem, powinieneś go zaakceptować. – NJones

Powiązane problemy