Ben Packard Ben Packard - 3 months ago 80
iOS Question

Completion block for popViewController

When dismissing a modal view controller using

dismissViewController
, there is the option to provide a completion block. Is there a similar equivalent for
popViewController
?

The completion argument is quite handy. For instance, I can use it to hold off removing a row from a tableview until the modal is off screen, letting the user see the row animation. When returning from a pushed view controller, I would like the same opportunity.

I have tried placing
popViewController
in an
UIView
animation block, where I do have access to a completion block. However, this produces some unwanted side effects on the view being popped to.

If there is no such method available, what are some workarounds?

Answer

I know an answer has been accepted over two years ago, however this answer is incomplete.

There is no way to do what you're wanting out-of-the-box

This is technically correct because the UINavigationController API doesn't offer any options for this. However by using the CoreAnimation framework it's possible to add a completion block to the underlying animation:

[CATransaction begin];
[CATransaction setCompletionBlock:^{
    // handle completion here
}];

[self.navigationController popViewControllerAnimated:YES];

[CATransaction commit];

The completion block will be called as soon as the animation used by popViewControllerAnimated: ends. This functionality has been available since iOS 4.