2

我正在尝试使用 popToViewController,但我不断收到错误“尝试弹出到不存在的视图控制器”?

我在设置视图中,当用户单击“退出”时,我关闭设置 VC 并转回到调用 unwind segue 方法的主视图。在 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 时,我得到“试图弹出到不存在的视图控制器”。

我对 self.navigationController.viewControllers 进行 NSLog 记录,我可以看到 VC 的堆栈,而我想要弹出的堆栈在里面?

/// 更新 //////

好的,这就是我发现的。如果我对“设置”的转场是常规的“推送”转场,那么代码可以工作,我会被弹回到我想要的位置。如果我从屏幕左侧进行自定义转场,则它会停止工作。即使使用自定义 segue,self.navigationcontroller.viewcontrollers 也会在堆栈中显示它。那么为什么我不能弹回它呢?或者我怎样才能用自定义转场回到它?

4

4 回答 4

0

好吧,这基本上告诉 objectatindex 1 不存在:

要尝试的事情:

objectatindex:0

或者

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

如果它是顶视图控制器,请尝试以下操作:

[navigationController topViewController]反而

于 2013-06-16T23:53:17.647 回答
0

我是否获得了正确的视图控制器层次结构?

  • 在您的基础上 UINavigationViewController 您已将主视图控制器设置为根视图控制器。
  • 然后设置视图控制器已被推送。
  • 通过“退出”,设置视图控制器被重新连接到主视图控制器。

如果是这样,您实际上是在尝试“返回”到不存在的视图控制器,因为您已经到达导航控制器堆栈的根视图控制器。在这种情况下,所有先前初始化的控制器都已从堆栈中弹出,您必须重新初始化并推送所需的视图控制器。

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

于 2013-06-16T21:58:24.110 回答
0
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;
    }
}
于 2015-02-20T09:29:18.403 回答
0

您可以使用该片段弹出到导航控制器堆栈中的 targetVC 的下一个视图控制器。

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];
});
于 2016-07-29T01:28:48.977 回答