2012-04-13 10 views
6

Ich muss auf die erste Ansicht in meiner App gehen. Ich habe ein paar Ansichten auf den Stapel geschoben, dann einen modalen Navigationscontroller und mehr Ansichten darauf geschoben.Gehe zur ersten Ansicht Controller in App

Das Problem, das ich habe, ist, dass die Verwendung [[self navigationController] popToRootViewControllerAnimated:YES]; nur zurück zur ersten Ansicht im modalen Stapel geht.

Und ich kann [[self navigationController] popToViewController:.. nicht funktionieren, weil der wahre erste Ansicht Controller mit [[self navigationController] viewControllers] nicht zugänglich ist.

Irgendwelche Ideen, wie dies zu erreichen ist? Vielen Dank.

+0

Welchen navigationController rufen Sie an? Es wird zu der Wurzel des Navigationscontrollers auftauchen, den ich mir vorstelle. –

+0

Machen Sie den ersten View-Controller als rootView-Controller Ihres navigationController –

+0

Schließen Sie den modalen View-Controller und dann auf root. – Till

Antwort

6

Tun Sie dies:

[[self navigationController] dismissModalViewControllerAnimated:YES]; 

, dass Sie an den VC zurück, die modal die Navigationssteuerung vorgestellt. Je weiter Sie danach zurückkommen, hängt davon ab, wie Sie diese "paar Ansichten" vor den Navigationscontroller geschoben haben.

bearbeiten - Erklärung an die tiefste Wurzel zu bekommen ...

Es ist wie diese „paar Ansichten“ klingt sind auf einem anderen, Navigationscontroller Stack zugrunde liegen. Dies kann ein wenig schwierig sein, da der saubere Weg, um weiter in diesem Stapel zurück zu kommen, darin besteht, den zugrunde liegenden Navigationscontroller zu seiner eigenen Wurzel zu bringen. Aber wie kann es wissen, dass der modale VC darüber getan wird?

Nennen wir den View-Controller, der die modale Präsentation des zweiten Navigationscontrollers VC_a durchgeführt hat. Es ist ein modal präsentiert Navigation Controller, dessen oberste VC ist VC_b. Wie kann VC_a wissen, zu seiner Navigationswurzel zu pop, wenn VC_b sich modally selbst entlässt?

Die gute Antwort (normalerweise) ist, dass VC_b entschieden hat, sich aus einem bestimmten Grund zu entschließen - eine Bedingung in Ihrer App/Ihrem Modell wurde geändert, damit sie sich dazu entschließen kann.

Wir möchten, dass VC_a diese Bedingung ebenfalls erkennt. Wenn VC_b entlassen wird, und VC_a bekommt eine viewWillAppear Nachricht, weil es über ist aufgedeckt werden:

// VC_a.m 

- (void)viewWillAppear:(BOOL)animated { 

    [super viewWillAppear:animated]; 
    if (/* some app condition that's true when VC_b is done */) { 
     // I must be appearing because VC_b is done, and I'm being uncovered 
     // That means I'm done, too. So pop... 
     [self.navigationController popToRootViewControllerAnimated:NO]; 
    } else { 
     // I must be appearing for the normal reason, because I was just pushed onto the stack 
    } 
} 
+0

Mein Problem ist, dass vor dem Löschen des Modal View-Controller habe ich Kein Verweis auf die Ansicht, die an der Spitze des Stapels steht, um sie an popToRoot zu senden. Alle anderen Ansichten vor der einzelnen modalen Ansicht wurden mit einem Push-Übergang mit performSegueWithIdentifier verschoben, keiner von ihnen ist modal. –

+0

Wer aber die modale Darstellung des zweiten Navigationscontrollers gemacht hat, weiß wer es ist. Dieser wird wissen, dass der Nav-Controller abgewiesen wird, wenn er einen (zweiten) viewWillAppear bekommt. Das kann man sich selbst machen. Bitte sehen Sie meine Bearbeitung. – danh

+0

Mit anderen Worten, der Entlassene weiß nicht, wen er knacken soll und sollte es auch nicht. Das Vorstellen tut es. – danh

0

brauchen Sie, es zu tun, indem Sie die delegation pattern verwenden. Insbesondere durch Erstellen eines Protokolls, das die Methode respondsToSelector des Delegierten implementiert.

Vollständige Details siehe this post. Es sollte fast genau das sein, was Sie suchen. Ich musste etwas Ähnliches tun, außer dass ich nur eine Ansicht vom Navigationsstapel löschen musste anstatt popToRootViewControllerAnimated: zu verwenden.

+0

das sieht so aus, als würde es auch funktionieren, ich könnte es schneller mit dem Code von der Bearbeitung auf der obigen Antwort implementieren. trotzdem danke –

0

In AppDelegate.m Klasse create-Methode mit Balg fließen ...

-(void)MethodName{//your method name 
    YourViewController *objViewController = [[[YourViewController alloc] initWithNibName:@"YourViewController" bundle:nil] autorelease]; ///define your viewcontroller name like "FirstViewController" 
    UINavigationController *yourNavigationController = [[[UINavigationController alloc] initWithRootViewController:objViewController] autorelease]; 

    self.window.rootViewController = yourNavigationController; 
} 

Wenn Sie auf Firstview umleiten möchten gerade von AppDelegate Objekt diese Methode aufrufen ....

0

Für iOS6 ...

[self.view.window.rootViewController dismissViewControllerAnimated:YES completion:nil]; 
Verwandte Themen