popToViewController is not working “Tried to pop to a view controller that doesn't exist”

风流意气都作罢 提交于 2019-12-08 00:27:34

问题


I am trying to use popToViewController and it I keep getting the error "Tried to pop to a view controller that doesn't exist"?

I am in a Settings view and when the user clicks "Sign Out" I dismiss the Settings VC and segue back to the mainView where an unwind segue method is called. In the unwind segue method I call the following.

-(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");
}

When the poptoVC is called I get the "Tried to pop to a view controller that doesn't exist".

I NSLog the self.navigationController.viewControllers and I can see the stack of VC's and the one I want to pop to is in there?

/// UPDATE //////

Ok here is what I have found. If my segue to Settings is a regular "push" segue then the code works and I get popped back to where I want. If I do a custom segue, having come from the left side of the screen then it stops working. Even with the custom segue the self.navigationcontroller.viewcontrollers shows its in the stack. So why can't I pop back to it? Or how can I pop back to it with the custom segue?


回答1:


Do I get the view controller hierarchy right?

  • On your basis UINavigationViewController you have set a main view controller as root view controller.
  • Then a settings view controller has been pushed upon this.
  • Via "Sign out" the settings view controller is being segued back to the main view controller.

If so, you are actually trying pop "back" to a view controller, that does not exist, since you already have reached the root view controller of your navigation controller stack. In this case, all previously initialized controllers have been popped from the stack and you would have to reinitialize and push the desired view controller.

If I am missing some important point, it would be helpful, if you would describe your actual view controller stack at the moment the "Sign out" option is available. Furthermore, what exactly is printed on the console if you log the self.navigationController.viewControllers array?




回答2:


well that basically tells objectatindex 1 does not exist:

things to try:

objectatindex:0

or

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

if its the topview controller then try below:

[navigationController topViewController] instead




回答3:


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;
    }
}



回答4:


you can use the snippet to pop out to targetVC's next viewController in the navigationController's stack.

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];
});


来源:https://stackoverflow.com/questions/17136892/poptoviewcontroller-is-not-working-tried-to-pop-to-a-view-controller-that-doesn

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!