【问题标题】:popToViewController: 'NSInternalInconsistencyException', reason: 'Tried to pop to a view controller that doesn't exist.'popToViewController:'NSInternalInconsistencyException',原因:'试图弹出一个不存在的视图控制器。
【发布时间】:2025-11-27 17:40:01
【问题描述】:

我的 Secondview 是 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' 的实例后调用终止

【问题讨论】:

标签: ios iphone uiviewcontroller uinavigationcontroller


【解决方案1】:

使用

[self.navigationController popViewControllerAnimated:YES];

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

【讨论】:

  • 对我来说 self.navigationController.viewControllers 似乎总是没有内容,即使我使用它的屏幕能够通过导航控制器的后退按钮弹回几个屏幕。
  • 在我看来,您的视图控制器不是 uinavigationcontroller 的子类
  • 太棒了!完美地工作。
【解决方案2】:

navigationController 管理 UIViewController 的堆栈。这就像一叠卡片。当您调用其中一种弹出方法时:

- (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  

弹出到上一个控制器(低于当前)。

因此,如果您想使用 navigationController 的 pop... 方法显示您的 AController *aview,它应该已经在 navigationController 堆栈中 - 这是 navigationController 的 viewControllers 属性:

@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];

【讨论】:

  • viewControllers的outlet、property和synthesize的获取方法
  • 我像你说的那样使用,但我得到的是空白的 whiteview
  • 这个 NSArray *viewControllers 是什么?
  • 当我尝试[navigationController popToViewController:aController animated:YES]; 时,它说aController is undefined。这是有道理的,因为我现在在bController,我没有aController 的参考,对吧?还是我在这里遗漏了什么?
  • 是的,如果你想弹出到明确的控制器,你应该参考它。最常见的做法是让所有控制器都可以访问对象中的所有必要引用,例如它可以是您的应用程序委托。如果在 MyAppDelegate.h 属性中定义 @property (retain) UIViewController * bController;您可以在任何地方访问 appdelegete 作为 MyAppDelegate * appDelegate =(MyAppDelegate *)[[UIApplication sharedApplication] delegate];然后你可以使用 appDelegate.bController;