2014-09-12 2 views
0

У меня есть стек контроллера навигации, скажем A (root) -> B-> C-> C-> C-> C-> D. Теперь я хочу, чтобы нажать кнопку в D, чтобы совать мне непосредственно B. Ссылаясь на некоторые решения в Stackoverflow, я использовал:popToViewController throws NSRangeException

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

Но он бросает NSRangeException:

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 3 beyond bounds [0 .. 2] 

Я не понимаю причина, поскольку в сообщении об ошибке нет ничего общего с цифрами «3» и «2».

Дополнительная информация в случае, если им нужно:

  1. Я SEGUE между А и В, и «pushViewController» впоследствии.
  2. Я спрятался панель навигации каждого контроллера. (Что очень важно для дизайна)

Надеется, что вы можете мне помочь! Благодаря!

+0

как может у поместить же VC сказать C, что много раз, есть у представлены он или толкает тот же C vc – sreekanthk

+0

Они одного класса, но имеют различный контент, такой как тег и изображение. – Conger

+0

Можете ли вы показать результат этой строки NSLog (@ "% @", [self.navigationController viewControllers]); где thecrash сделано – BHASKAR

ответ

1
for (UIViewController *controllers in self.navigationController.viewControllers) { 

    if ([controllers isKindOfClass:[DesiredViewController class]]) { 

     [self.navigationController popToViewController:controllers 
               animated:YES]; 
     break; 
    } 
} 
+0

Нет, не работает. По-прежнему выбрасывается одно и то же исключение. – Conger

+0

отладить код и убедиться, что B находится в вашей навигационной иерархии. –

+0

Да, я уверен. Я печатал стек перед каждым нажатием, используя 'NSLog (@"% @ ", [self.navigationController viewControllers]); ', а результат -" A "," B "," C "," C "," C "," C "' при последнем нажатии до D. – Conger

0
NSArray *existingControllers = [self.navigationController viewControllers]; 
B *theB; 
for(UIViewController *eachCtrl in existingControllers) 
{ 

    if([eachCtrl isKindOfClass:[B class]]) 
    { 
     int Bx = [existingControllers indexOfObject:eachCtrl] 
     theB = [existingControllers objectAtIndex:Bx]; 
    } 

} 

//Now do your popping of B controller 
if(nil != theB) 
    [self.navigationController popToViewController:theB animated:YES]; 

, и я думаю, что вы делаете ошибку, создавая много экземпляров «C». , а также проверить, что существующие контроллеры имеют экземпляр B в нем во время отладки.

0

Используйте это:

if ([[self.navigationController viewControllers] count]>1) { 
    [self.navigationController popToViewController:[[self.navigationController viewControllers] objectAtIndex:1] animated:YES]; 
} 
0

Там на самом деле ничего плохого в использовании:

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

Если стек навигации A (корень) -> B-> C-> C-> C -> C-> D. Я протестировал и приложил к этому образец проекта.

Download

1

Используйте этот код:

Let view controllers in stack are A->B->C->D->E 

, если вы хотите, чтобы выскочить на C, то

for(UIViewController *vc in [self.navigationController.viewControllers]) 
{ 
    if(vc isKindOfClass [C class]) 
    { 
      [self.navigationController popToViewController:vc animated:YES]; 
    } 
} 
Смежные вопросы