popToViewController: «NSInternalInconsistencyException», причина: «Попытка вытолкнуть несуществующий контроллер представления».

Мое второе представление — BController *bview. теперь в этом представлении есть 1 кнопка назад

при нажатии этой кнопки назад

-(IBAction)done:(id)sender
{
AController *aview= [[AController alloc] initWithNibName:@"AController" bundle:[NSBundle mainBundle]];

    NSArray *array = [self.navigationController popToViewController: aview animated:YES];

}

AController *aview - это не что иное, как мое первое представление, или вы можете сказать первое представление

но при нажатии кнопки "Назад" я получаю исключение

** Завершение работы приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «Попытка вытолкнуть несуществующий контроллер представления». 2010-03-18 15:53:05.948 IChitMe[5072:207] Stack: ( 820145437, 837578260, 819694387, 814928571, 862794500, 862794216, 54911, 819902607, 861951876, 862404412, 819902607, 861951876, 861951724, 861951668, 861950732, 861953932 , 861948160, 861945748, 861927312, 861925524, 858687888, 819893547, 819891231, 858682228, 861592624, 861585968, 10069, 9964 ) Исключение вызывается после завершения NS


person user217572    schedule 18.03.2010    source источник
comment
Для немецких разработчиков есть хороший учебник: be Differently.wordpress .com/2012/01/15/   -  person simon meier    schedule 17.01.2012


Ответы (2)


navigationController управляет стеком UIViewControllers. Это как стопка карт. Когда вы вызываете один из методов pop:

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated
- (UIViewController *)popViewControllerAnimated:(BOOL)animated

вы удаляете некоторые контроллеры сверху и показываете соответствующий контроллер:

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated  

выталкивается на первый (то есть самый нижний в стеке) контроллер, он называется «корневым».

- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated 

извлекается в указанный viewController, и обратите внимание, что он уже должен быть в стеке!

- (UIViewController *)popViewControllerAnimated:(BOOL)animated  

всплывает на предыдущий контроллер (ниже текущего).

Итак, если вы хотите показать свой AController *aview, используя метод pop... для navigationController, он должен быть уже в стеке navigationController - это свойство viewControllers для navigationController:

@property(nonatomic, copy) NSArray *viewControllers

Например:

aController = [[AController alloc] initWithNibName:@"AController" bundle:[NSBundle mainBundle]];
bController = [[BController alloc] initWithNibName:@"BController" bundle:[NSBundle mainBundle]];
navigationController = [[UINavigationController alloc] initWithRootViewController:aController]; 
[navigationController pushViewController:bController];

теперь отображается bController, и вы можете позвонить:

[navigationController popToViewController:aController animated:YES];
person Vladimir    schedule 18.03.2010
comment
как взять выход, свойство и синтезировать viewControllers - person user217572; 18.03.2010
comment
Я использовал, как вы говорите, но я получаю пустой белый вид - person user217572; 18.03.2010
comment
что это за NSArray *viewControllers? - person user217572; 18.03.2010
comment
Когда я пытаюсь [navigationController popToViewController:aController animated:YES];, он сказал, что aController is undefined. Это имеет смысл, так как я сейчас в bController, у меня нет ссылки на aController, верно? или я что-то пропустил здесь? - person Thang Pham; 07.04.2010
comment
Да, если вы хотите перейти к определенному контроллеру, у вас должна быть ссылка на него. Наиболее распространенной практикой является наличие всех необходимых ссылок в объекте, доступных со всех контроллеров, например, это может быть делегат вашего приложения. Если вы определяете в MyAppDelegate.h свойство @property (retain) UIViewController * bController; Вы можете получить доступ к appdelegete где угодно, как MyAppDelegate * appDelegate =(MyAppDelegate *)[[UIApplication sharedApplication]делегат]; И тогда вы можете использовать appDelegate.bController; - person Vladimir; 08.04.2010
comment
@Владимир, честно говоря, отличный совет. Так рада, что я это прочитала!! Никогда не думал, как перемещаться по иерархии представлений таким образом. А как насчет проблем с памятью? Сохраняет ли это дополнительный контроллер представления в оперативной памяти? - person bkbeachlabs; 25.06.2013

Использовать

[self.navigationController popViewControllerAnimated:YES];

OR

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
person Mihir Mehta    schedule 18.03.2010
comment
Для меня кажется, что self.navigationController.viewControllers всегда не имеет содержимого, хотя экран, на котором я его использую, может отобразить несколько экранов с помощью кнопки «Назад» навигационного контроллера. - person Andrew S; 24.03.2013
comment
мне кажется, что ваш контроллер представления не является подклассом uinavigationcontroller - person Mihir Mehta; 01.04.2013
comment
Большой! Работал Безупречно. - person JohnAnge Kernodle; 22.10.2013