2009-07-14 4 views
24

Ich habe eine UINavigationController mit einer Reihe von UIViewControllers darauf. Unter Umständen möchte ich genau zwei Ebenen zurückspringen. Ich dachte, ich könnte es tun, indem ich popViewControllerAnimated zweimal hintereinander rufe, aber es stellt sich heraus, dass das zweite Mal, wenn ich es nenne, es nichts knallt und stattdessen NULL zurückgibt. Muss ich einen Verweis auf meine Ziel-VC speichern und stattdessen popToViewControllerAnimated aufrufen? Ich kann das machen, aber es verkompliziert meinen Code, da ich die UIViewController * herumreichen muss, während ich VCs auf den Stapel dränge.Aufruf popViewControllerAnimiert zweimal

Hier ist der relevante Auszug:

UIViewController* one = [self.navigationController popViewControllerAnimated:YES]; 
if (...) { 
    // pop twice if we were doing XYZ 
    UIViewController *two = [self.navigationController popViewControllerAnimated:YES]; 
    // stored in "one" and "two" for debugging, "two" is always 0 here. 
} 

Bin ich etwas seltsam hier? Ich möchte den idiomatischen Code schreiben, also wenn der "richtige" Weg ist, popToViewControllerAnimated oder etwas ganz anderes zu nennen, werde ich es gerne ändern.

Antwort

63

In diesem Fall müssten Sie zurück zu einem bestimmten Viewcontroller in der Navigation Pop wie so:

[self.navigationController popToViewController:[[self.navigationController viewControllers] objectAtIndex:2] animated:YES]; 

Dieser Code würde auf der Navigation Stack auf den dritten Viewcontroller Pop.

+1

oooh, ich glaube ich, dass die Arbeit für mich machen kann, ohne um die Viewcontroller Zeiger passieren zu müssen. Vielen Dank! –

+4

Als eine FYI musste ich die ViewControllers.count - 3 verwenden, um zwei zurück zu gehen. vc.count - 1 ist die Draufsicht und zwei zurück von dort ist -3. –

+1

Perfekt! Du wusstest sogar, dass ich zum dritten Viewcontroller springen wollte - alles, was ich tun musste, war Cut and Paste. Vielen Dank. –

19

Ich denke, es ist besser, die Anzahl der View-Controller in Ihrem Stack zu zählen und dann die Anzahl der View-Controller, die Sie popen möchten, zu subtrahieren. später

NSInteger noOfViewControllers = [self.navigationController.viewControllers count]; 
[self.navigationController 
popToViewController:[self.navigationController.viewControllers 
objectAtIndex:(noOfViewControllers-2)] animated:YES]; 

Mit dieser Lösung Sie verwirren wird nicht das Pop-up, wenn Sie eine neue Ansicht zu Ihrem Projekt hinzufügen.

+3

Die View-Controller haben den Index 0 bis (noOfViewControllers-1). Somit ist der aktuelle View-Controller (noOfViewControllers-1). (noOfViewControllers-2) entspricht popViewController. Um zurück zu gehen 2 View-Controller verwenden (noOfViewControllers-3). –

+0

@Flatron Ein kleines Edit zu Ihrer Antwort muss dies für 2 Ebenen sein, da count keine 0 Platzierung berücksichtigt wie objectAtIndex: NSInteger noOfViewControllers = [self.navigationController.viewControllers count] -1; [self.navigationController popToViewController: [self.navigationController.viewControllers objectAtIndex: (noOfViewControllers-2)] animiert: YES]; – wilforeal

+0

Vielen Dank für die Suite Antwort –

1

Auch, was Sie falsch gemacht haben, glaube ich, der Grund, warum [self.navigationController popViewControllerAnimated:YES] nicht das zweite Mal funktioniert, ist, weil Sie wahrscheinlich diesen zweiten Anruf auf dem Bildschirm, der beim ersten Anruf gepoppt wird. Nach dem ersten Aufruf wird die aktuelle Ansicht vom Navigationscontroller entfernt. Wenn Sie den zweiten Aufruf ausführen, gibt self.navigationController den Wert nil zurück, da kein Navigationscontroller mehr vorhanden ist.

2

Es funktioniert für mich, wenn Sie den Verweis auf die UINavigationViewController und verwenden Sie die gespeicherte Instanz speichern:

UINavigationViewController* savedUinvc = self.navigationController; 
UIViewController* one = [savedUinvc popViewControllerAnimated:YES]; 
if (...) { 
    // pop twice if we were doing XYZ 
    UIViewController *two = [savedUinvc popViewControllerAnimated:YES]; 
    // stored in "one" and "two" for debugging, "two" is always 0 here. 
} 
+0

hat für mich auch wie du gearbeitet - aber keine Ahnung warum ...? Hast du es am Ende herausgefunden? – geebee

Verwandte Themen