17

Utilizzo di iOS I 15 ViewControllers ora si desidera eseguire il pop da un ViewController a un altro View Controller.Come passare da un controller di visualizzazione a un altro controller di vista

Sto usando questo codice:

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

Questa mostra errore this ViewController not exist e poi sto usando questo codice:

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

Questo codice è giusto al pop da thirdViewController a secondViewController. Ma cosa è successo quando abbiamo pop dal nono (9 °) ViewController al quinto (5 °) ViewController quindi sto usando questo codice in nona (9 °) ViewController:

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

Esso non pop dal nono (9 °) ViewController a Quinto (5) ViewController a parte che viene visualizzato Nono (9 °) ViewController to Eight (8th) ViewController. Non so cosa sia successo quando usiamo questa linea:

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

Quando usiamo questo Ninth(9th)ViewController. Mostra NsLog:

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

Non so perché solo i controller di vista Quattro mostrano. Ogni volta che sto usando 15 View Controller. Questo problema si verifica in ciascun controller di visualizzazione. Ad esempio, se sto usando il pop form il quindicesimo (15 °) ViewController al quinto (quinto) ViewController, lo stesso problema si manifesta.

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

array=  First(1st)ViewController; 
      Second(2nd)ViewController; 
      fourteenth(14th)ViewController; 
      fifteenth(15th)ViewController; 

Voglio contare Numero di ViewControllers e poi pop a specifici ViewController.

+2

Sei sicuro che tutti i ViewController siano stati inviati al NavigationController? – talnicolas

risposta

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

                break; 
            } 
        } 
1

Prova come questo

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

Primo:

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

Non si può fare questo perché si assegna un nuovo controller Sec vista che non è in un controller di navigazione.

considerare l'utilizzo di questo:

Sei 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

Non si può pop in un nuovo controller della vista (come si fa con il vostro esempio secondViewController).

Quando si utilizza un UINavigationController si

Aggiungi controller allo stack con:

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

Pop alla precedente con:

[self.navigationController popViewControllerAnimated:YES]; 

Pop ad un precedente controller in la pila (deve essere stato spinto prima):

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

Torna alla radice Regolatore con

[self.navigationController popToRootViewControllerAnimated:YES]; 
6

Prova questa

[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

per SWIFT 3.0 , utilizzare il filtro:

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