Mike Kale
Mike Kale

Reputation: 4133

Calling popViewControllerAnimated twice

I've got a UINavigationController with a series of UIViewControllers on it. Under some circumstances, I want to pop back exactly two levels. I thought I could do it by calling popViewControllerAnimated twice in a row, but it turns out that the second time I call it, it's not popping anything and instead returning NULL. Do I need to store a reference to my destination VC and call popToViewControllerAnimated instead? I can do that, but it complicates my code since I'd have to pass the UIViewController* around as I'm pushing VCs onto the stack.

Here's the relevant snippet:

UIViewController* one = [self.navigationController popViewControllerAnimated:YES];
if (...) {
    // pop twice if we were doing XYZ
    UIViewController *two = [self.navigationController popViewControllerAnimated:YES];
    // stored in "one" and "two" for debugging, "two" is always 0 here.
}

Am I doing something weird here? I want to write idiomatic code, so if the "right" way is to call popToViewControllerAnimated, or something else entirely, I'll happily change it.

Upvotes: 28

Views: 24780

Answers (4)

Eugene Osovetsky
Eugene Osovetsky

Reputation: 6541

It works for me if you save the reference to the UINavigationViewController and use the saved instance:

UINavigationViewController* savedUinvc = self.navigationController;
UIViewController* one = [savedUinvc  popViewControllerAnimated:YES];
if (...) {
    // pop twice if we were doing XYZ
    UIViewController *two = [savedUinvc  popViewControllerAnimated:YES];
    // stored in "one" and "two" for debugging, "two" is always 0 here.
}

Upvotes: 2

Scott Pfeil
Scott Pfeil

Reputation: 414

Also, as to what you were doing wrong, I believe the reason why [self.navigationController popViewControllerAnimated:YES] isn't working the second time is because you are probably making this second call on the screen that is being popped on the first call. After the first call, the current view is removed from the navigation controller, so by the time you make the second call, self.navigationController will return nil because it no longer has a navigation controller.

Upvotes: 1

Flatron
Flatron

Reputation: 687

I think its better to count the number of view controllers in you stack and then subtract the number of view controllers you would like to pop.

 NSInteger noOfViewControllers = [self.navigationController.viewControllers count];
 [self.navigationController 
 popToViewController:[self.navigationController.viewControllers 
 objectAtIndex:(noOfViewControllers-2)] animated:YES];

With this solution you wont mess up the pop if you add a new view to your project later.

Upvotes: 21

Ben Harris
Ben Harris

Reputation: 5684

In this case you would need to pop back to a specific viewcontroller in the navigationController like so:

[self.navigationController popToViewController:[[self.navigationController viewControllers] objectAtIndex:2] animated:YES];

That code would pop to the third viewcontroller on the navigationController's stack.

Upvotes: 73

Related Questions