17

Использование iOS У меня есть 15 ViewControllers, теперь я хочу поместить из одного ViewController в другой контроллер просмотра.Как поместить с одного контроллера вида на другой контроллер представления

Я использую этот код:

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

Это показывает ошибку this ViewController not exist, а затем я использую этот код:

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

Этот код правильно совать от thirdViewController к secondViewController. Но что случилось, когда мы выскочить из Девятой (9-е) ViewController к Пятой (пятый) ViewController тогда я использую этот код в Девятой (9) ViewController:

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

Это не выскакивает из девятого (9) ViewController к Пятой (5-й) ViewController, кроме того, что он появляется девятый (9-й) ViewController до восьми (8-го) ViewController. Я не знаю, что случилось, когда мы используем эту строку:

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

Когда мы используем это в Ninth(9th)ViewController. NsLog показывает:

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

Я не знаю, почему только четыре контроллера просмотра. Всякий раз, когда я использую 15 View Controllers. Эта проблема возникает в каждом контроллере представления. Например, если я использую pop-форму пятнадцатого (15-го) ViewController для пятого (5-го) ViewController, то та же проблема проявляется.

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

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

Я хочу подсчитать количество ViewControllers, а затем pop to specific ViewController.

+2

Вы уверены, что все ViewControllers будут нажаты на NavigationController? – talnicolas

ответ

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

                break; 
            } 
        } 
1

Попробуйте как этот

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

Первая:

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

Вы не можете сделать это, потому что вы выделить новый контроллер Sec вид, что это не в навигационном контроллере.

Рассмотрите возможность использования этого:

Вы в 9 вид контроллера

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

Вы не можете выскочить на новый контроллер представления (как вы делаете с вашим secondViewController например).

При использовании UINavigationController вы

Добавить контроллер в стек с:

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

Поп на предыдущую с:

[self.navigationController popViewControllerAnimated:YES]; 

Попа к предыдущей контроллер в стек (Должно быть, были вытеснены ранее):

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

Возвращайтесь к корню контроллер с

[self.navigationController popToRootViewControllerAnimated:YES]; 
6

Попробуйте

[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

для Swift 3.0 , используйте фильтр:

let desiredViewController = self.navigationController!.viewControllers.filter { $0 is YourViewController }.first! 
self.navigationController!.popToViewController(desiredViewController, animated: true) 
Смежные вопросы