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.