ioscocoa-touchuiviewuiviewcontrolleruiviewanimation

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?


Solution

  • 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.