Reputation: 1048
I have some cleanup that needs to be performed in a shared resource any time one of my view controllers is dismissed/popped/unloaded? This could either be when the user hits the back button on that individual screen or if a call to popToRootViewController is made (in which case, I would ideally be able to clear up every controller that was popped.)
The obvious choice would be to do this in viewDidUnload, but of course, that isn't how unload works. Is there a way to catch all cases to where the ViewController is removed from the stack?
edit:Forgot to mention that I am doing this using Xamarin so that may or may not impact the answers.
Upvotes: 15
Views: 9057
Reputation: 41
Building upon @Enricoza's comment, if you do have your UIViewController embedded in a UINavigationController, try this out:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if ((navigationController?.isBeingDismissed) != nil) {
// Add clean up code here
}
}
Upvotes: 4
Reputation: 1083
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
if (isBeingDismissed() || isMovingFromParentViewController()) {
// clean up code here
}
}
EDIT for swift 4/5
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
if (isBeingDismissed || isMovingFromParent) {
// clean up code here
}
}
Upvotes: 24
Reputation: 13791
-dealloc
is probably your best bet. The view controller will be deallocated when it is popped from the stack, unless you are retaining it elsewhere.
viewWillDisappear:
and viewDidDisappear:
aren't good choices because they are called any time the view controller is no longer shown, including when it pushes something else on the stack (so it becomes second-from-the-top).
viewDidUnload
is no longer used. The system frameworks stopped calling this method as of iOS 6.
Upvotes: 9