popToViewController:'NSInternalInconsistencyException',原因:'试图弹出到不存在的视图控制器.'

use*_*572 1 iphone uiviewcontroller uinavigationcontroller ios

我的第二个观点是BController*bview.现在在这个视图中有1个后退按钮

点击后退按钮

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

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

}
Run Code Online (Sandbox Code Playgroud)

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)在抛出'NSException'实例后终止被调用

Mih*_*hta 24

使用

[self.navigationController popViewControllerAnimated:YES];
Run Code Online (Sandbox Code Playgroud)

要么

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
Run Code Online (Sandbox Code Playgroud)


Vla*_*mir 6

navigationController管理UIViewControllers的堆栈.这就像一叠牌.当您调用其中一个pop方法时:

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated
- (UIViewController *)popViewControllerAnimated:(BOOL)animated
Run Code Online (Sandbox Code Playgroud)

从顶部删除一些控制器,并显示相应的控制器:

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated  
Run Code Online (Sandbox Code Playgroud)

弹出到第一个(即堆栈中最低的)控制器,它被称为"根".

- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated 
Run Code Online (Sandbox Code Playgroud)

弹出到指定的viewController,并注意它应该已经在堆栈中!

- (UIViewController *)popViewControllerAnimated:(BOOL)animated  
Run Code Online (Sandbox Code Playgroud)

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

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

@property(nonatomic, copy) NSArray *viewControllers
Run Code Online (Sandbox Code Playgroud)

例如:

aController = [[AController alloc] initWithNibName:@"AController" bundle:[NSBundle mainBundle]];
bController = [[BController alloc] initWithNibName:@"BController" bundle:[NSBundle mainBundle]];
navigationController = [[UINavigationController alloc] initWithRootViewController:aController]; 
[navigationController pushViewController:bController];
Run Code Online (Sandbox Code Playgroud)

现在显示bController,你可以调用:

[navigationController popToViewController:aController animated:YES];
Run Code Online (Sandbox Code Playgroud)

  • 是的,如果你想要弹出确定的控制器,你应该有一个参考.最常见的做法是在对象中访问所有必需的引用,例如它可以是您的应用程序委托.如果在MyAppDelegate.h中定义属性@property(retain)UIViewController*bController; 你可以在任何地方访问appdelegete,如MyAppDelegate*appDelegate =(MyAppDelegate*)[[UIApplication sharedApplication] delegate]; 然后你可以使用appDelegate.bController; (2认同)