iOS how to detect programmatically when top view controller is popped?

iOS 5 introduced two new methods to handle exactly this type of situation. What you’re looking for is -[UIViewController isMovingToParentViewController]. From the docs:

isMovingToParentViewController

Returns a Boolean value that indicates
that the view controller is in the process of being added to a parent.

- (BOOL)isMovingToParentViewController

Return Value
YES if the view controller is appearing because it was added as a child of a container
view controller, otherwise NO.

Discussion
This method returns YES only when called from inside the
following methods:

-viewWillAppear:
-viewDidAppear:

In your case you could implement -viewWillAppear: like so:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    if (self.isMovingToParentViewController == NO)
    {
        // we're already on the navigation stack
        // another controller must have been popped off
    }
}

EDIT: There’s a subtle semantic difference to consider hereā€”are you interested in the fact that VC2 in particular popped off the stack, or do you want to be notified each time VC1 is revealed as a result of any controller popping? In the former case, delegation is a better solution. A straight-up weak reference to VC1 could also work if you never intend on reusing VC2.

EDIT 2: I made the example more explicit by inverting the logic and not returning early.

Leave a Comment