Ios popToViewController不工作“;试图弹出到不显示';“不存在”;

Ios popToViewController不工作“;试图弹出到不显示';“不存在”;,ios,objective-c,segue,poptoviewcontroller,Ios,Objective C,Segue,Poptoviewcontroller,我正在尝试使用popToViewController,但我不断收到错误“试图弹出到不存在的视图控制器” 我在设置视图中,当用户单击“注销”时,我将关闭设置VC并返回到主视图,在主视图中调用一个unwind segue方法。在unwindsegue方法中,我调用以下命令 -(IBAction)endSettingsViaLogout:(UIStoryboardSegue *)segue { //[self performSegueWithIdentifier:@"mainToLoginSegue

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

我在设置视图中,当用户单击“注销”时,我将关闭设置VC并返回到主视图,在主视图中调用一个unwind segue方法。在unwindsegue方法中,我调用以下命令

-(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,我可以看到VC的堆栈,我想弹出的堆栈就在那里?

///更新//////


好的,这是我发现的。如果我的segue to Settings是一个常规的“push”segue,那么代码会工作,我会弹出到我想要的地方。如果我做了一个自定义的segue,来自屏幕的左侧,那么它将停止工作。即使使用自定义segue,self.navigationcontroller.viewcontrollers也会在堆栈中显示其属性。那为什么我不能回到过去呢?或者如何使用自定义segue返回到它?

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

  • 在UINavigationViewController的基础上,您已将主视图控制器设置为根视图控制器
  • 然后在此基础上推送设置视图控制器
  • 通过“注销”,设置视图控制器被分回到主视图控制器
如果是这样,您实际上是在尝试弹出“返回”到不存在的视图控制器,因为您已经到达导航控制器堆栈的根视图控制器。在这种情况下,所有先前初始化的控制器都已从堆栈中弹出,您必须重新初始化并推送所需的视图控制器


如果我遗漏了一些重要的观点,如果您能在“注销”选项可用时描述您的实际视图控制器堆栈,这将非常有用。此外,如果您记录self.navigationController.viewControllers数组,控制台上到底打印了什么

这基本上说明objectatindex 1不存在:

尝试的事项:

objectatindex:0

如果是topview控制器,请尝试以下操作:

[navigationController-topViewController]
取而代之的是

NSArray*viewControllers=[[self-navigationController]viewControllers];
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;
    }
}

对于(int i=0;i,您可以使用该代码段弹出到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];
});

请看我的最后一句话。我想要的视图控制器在那里并且存在。执行“po self.navigationController.viewcontrollers”可以在列表中看到它。我可以执行[self.navigationController.viewcontrollers objectAtIndex:1]当你使用自定义segue时…你是在使用self.navigationcontroller吗?这在很大程度上取决于你的自定义segue对堆栈做了什么,以及当你调用
popToViewController:
segue何时调用?在popToViewController之前还是之后?如果ue已经将用户带回主屏幕,为什么您要尝试弹出视图控制器?更多详细说明您的序列和事件顺序的代码将非常有帮助。
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];
});