**UPDATE:** According to some comments, the solution in the original answer does not seem to work under certain scenarios in iOS 8+. I can't verify that that is actually the case without further details.
For those of you however in that situation there's an alternative. Detecting when a view controller is being popped is possible by overriding `willMove(toParentViewController:)`. The basic idea is that a view controller is being popped when `parent` is `nil`.
Check out ["Implementing a Container View Controller"][1] for further details.
___
Since iOS 5 I've found that the easiest way of dealing with this situation is using the new method `- (BOOL)isMovingFromParentViewController`:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if (self.isMovingFromParentViewController) {
// Do your stuff here
}
}
`- (BOOL)isMovingFromParentViewController` makes sense when you are pushing and popping controllers in a navigation stack.
However, if you are presenting modal view controllers you should use `- (BOOL)isBeingDismissed` instead:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if (self.isBeingDismissed) {
// Do your stuff here
}
}
As noted in [this question](
[To see links please register here]
), you could combine both properties:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if (self.isMovingFromParentViewController || self.isBeingDismissed) {
// Do your stuff here
}
}
Other solutions rely on the existence of a `UINavigationBar`. Instead like my approach more because it decouples the required tasks to perform from the action that triggered the event, i.e. pressing a back button.
[1]:
[To see links please register here]