Reputation: 4133
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
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
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
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
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