17

Verwenden von iOS Ich habe 15 ViewControllers, jetzt möchte ich von einem ViewController zu einem anderen View-Controller wechseln.Wie man von einem View-Controller zu einem anderen View-Controller springt

ich diesen Code verwende:

SecondViewController *Sec=[SecondViewController alloc]init]; 
[self.navigationController popViewController:Sec animated:YES]; 

Dies zeigt Fehler this ViewController not exist und dann verwende ich diesen Code:

NSArray *array = [self.navigationController viewControllers]; 
[self.navigationController popToViewController:[array objectAtIndex:1] animated:YES]; 

Dieser Code richtig ist von thirdViewController zu secondViewController Pop. Aber was passiert, wenn wir Pop von Neunten (9.) Viewcontroller zu Fünfte (5.) Viewcontroller dann ich diesen Code verwende in Neunten (9.) Viewcontroller:

NSArray *array = [self.navigationController viewControllers]; 
[self.navigationController popToViewController:[array objectAtIndex:4] animated:YES]; 

Es Pop nicht von Neunten (9.) Viewcontroller zu Fünfte (5.) ViewController auseinander, dass es Neunte (9.) ViewController auf Acht (8.) ViewController Pops. Ich weiß nicht, was passiert, wenn wir diese Linie verwenden:

NSArray *array = [self.navigationController viewControllers]; 
NsLog(@"array = %@",array); 

Wenn wir dies verwenden in Ninth(9th)ViewController. NsLog zeigt:

array= First(1st)ViewController; 
     Second(2nd)ViewController; 
     Eight(8th)ViewController; 
     Ninth(9th)ViewController; 

Ich weiß nicht, warum nur Vier-Ansichten-Controller zeigen. Immer wenn ich 15 View Controller verwende. Dieses Problem tritt in jedem Ansichtscontroller auf. Zum Beispiel, wenn ich pop Form fünfzehnten (15.) ViewController bis Fifth (5.) ViewController verwenden, dann manifestiert sich dasselbe Problem.

Ich möchte die Anzahl der ViewControllers zählen und dann zu bestimmten ViewController.

+2

Sind Sie sicher, dass alle ViewController an den NavigationController übertragen wurden? – talnicolas

Antwort

26
for (UIViewController *controller in self.navigationController.viewControllers) 
        { 
            if ([controller isKindOfClass:[nameOfYourViewControllerYouWantToNavigate class]]) 
            { 
                [self.navigationController popToViewController:controller animated:YES]; 

                break; 
            } 
        } 
1

wie diese

MyTableViewController *vc = [[MyTableViewController alloc] init]; 
NSMutableArray *controllers = [NSMutableArray  
arrayWithArray:self.navigationController.viewControllers]; 
[controllers removeLastObject]; 
[controllers addObject:vc]; 
4

First Try:

SecondViewController *Sec=[SecondViewController alloc]init]; 
[self.navigationController popViewController:Sec animated:YES]; 

Sie können dies nicht tun, weil Sie einen neuen Sec View-Controller zuweisen, die nicht in einem Navigationscontroller ist.

Betrachten Sie dies mit:

Sie sind in 9-View-Controller

for (int i= 0 ; i < [[self.navigationController viewControllers]count] ; i++) { 
    if ([[[self.navigationController viewControllers] objectAtIndex:i] isKindOfClass:[FifiViewControllerClassname class]]) { 
     [self.navigationController popToViewController:[array objectAtIndex:i] animated:YES]; 
    } 
} 
35

Sie können nicht auf eine neue View-Controller-Pop (wie Sie mit Ihrem secondViewController Beispiel tun).

Wenn ein UINavigationController verwenden Sie

hinzufügen Regler auf den Stapel mit:

[self.navigationController pushViewController:<yournewViewController> animated:YES]; 

Pop zum vorherigen mit:

[self.navigationController popViewControllerAnimated:YES]; 

Pop zu einem früheren Controller in der Stapel (gedrückt wurden, bevor Muss):

[self.navigationController popToViewController:<ViewControllerToPopTo> animated:YES]; 

an die Wurzel-Controller mit

[self.navigationController popToRootViewControllerAnimated:YES]; 
6

Versuchen Sie, diese

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0] animated:YES]; 
1
BOOL check = FALSE; 
NSArray *viewControllers = [[self navigationController] viewControllers]; 
id obj; 
for(int i=0;i<[viewControllers count];i++) 
{ 
    obj=[viewControllers objectAtIndex:i]; 
    if([obj isKindOfClass:[yourclassname class]]) 
    { 
     check = TRUE; 
     break; 
    } 
} 

if (check) 
{ 

    [[self navigationController] popToViewController:obj animated:YES]; 
} 
else 
{ 
    yourclassname *yourclassnameObj=[self.storyboard instantiateViewControllerWithIdentifier:@"yourclassStoryBoardID"]; 
    [self.navigationController pushViewController:yourclassnameObj animated:true]; 

} 
1

für Swift 3.0 Zurück , Filter verwenden:

let desiredViewController = self.navigationController!.viewControllers.filter { $0 is YourViewController }.first! 
self.navigationController!.popToViewController(desiredViewController, animated: true) 
Verwandte Themen