popToViewController不工作“试图popup到不存在的视图控制器”

我试图使用popToViewController,它不断收到错误“试图popup到不存在的视图控制器”?

我在“设置”视图中,当用户单击“注销”时,我closures“设置”VC并继续返回到调用展开segue方法的mainView。 在unwind segue方法中,我称之为以下。

-(IBAction)endSettingsViaLogout:(UIStoryboardSegue *)segue { //[self performSegueWithIdentifier:@"mainToLoginSegue" sender:self]; [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES]; //[self.navigationController popViewControllerAnimated:YES]; DLog(@"User finished with search"); } 

当poptoVC被调用时,我得到“试图popup到不存在的视图控制器”。

我NSLog的self.navigationController.viewControllers,我可以看到VC的堆栈,我想popup一个在那里?

///更新//////

好的,这是我发现的。 如果我的设置是一个常规的“推”塞格,然后代码工作,我popup回到我想要的地方。 如果我做了一个自定义的继续,从屏幕左侧来,然后停止工作。 即使使用自定义segue,self.navigationcontroller.viewcontrollers也会在堆栈中显示它。 那么为什么我不能回弹呢? 或者我怎样才能回到自定义赛格呢?

我能得到视图控制器的层次吗?

  • 在你的基础上UINavigationViewController你已经设置了一个主视图控制器作为根视图控制器。
  • 然后一个设置视图控制器已经推到这一点。
  • 通过“注销”设置视图控制器正在被closures回主视图控制器。

如果是这样,你实际上试图popup一个视图控制器,这是不存在的,因为你已经到达了你的导航控制器堆栈的根视图控制器。 在这种情况下,所有以前初始化的控制器都从堆栈popup,您将不得不重新初始化并推送所需的视图控制器。

如果我错过了一些重要的观点,那么在“退出”选项可用的时候,如果您要描述实际的视图控制器堆栈,将会很有帮助。 此外,如果您loggingself.navigationController.viewControllers数组,则在控制台上打印了什么?

那么基本上告诉objectatindex 1不存在:

事情要尝试:

 objectatindex:0 

要么

 nslog(@"%d",[[self.navigationController.viewControllers]count]);//add it before the popline and see if it works 

如果它的顶视图控制器然后尝试下面:

而不是[navigationController topViewController]

 NSArray *viewControllers = [[self navigationController] viewControllers]; for( int i=0;i<[viewControllers count];i++) { id obj=[viewControllers objectAtIndex:[viewControllers count]-i-1]; if([obj isKindOfClass:[OrderCheckOutViewController class]]){ [[self navigationController] popToViewController:obj animated:YES]; return; } } 

你可以使用这个片段popup到navigationController栈的targetVC的下一个viewController。

 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ BOOL findIt = NO; UIViewController *targetVC = nil; for (UIViewController *subVC in self.navigationController.viewControllers) { if (findIt) { break; } if (subVC == xxx) { findIt = YES; }else{ targetVC = subVC; } } [self.navigationController popToViewController:targetVC animated:NO]; });