popToViewController: «NSInternalInconsistencyException», причина: «Попытка получить доступ к контроллеру представления, который не существует». - PullRequest
1 голос
/ 18 марта 2010

Мое второе представление - 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] Стек: ( 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 ) прекращение вызова после выброса экземпляра 'NSException'

Ответы [ 2 ]

24 голосов
/ 18 марта 2010

Использование

[self.navigationController popViewControllerAnimated:YES];

OR

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
6 голосов
/ 18 марта 2010

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

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

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

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated  

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

- (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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...