Reputation: 1792
I work on a legacy application, and have found out, that my view[Will/Did]Disappear
methods are not always fired properly.
The case is, I have a (custom) UIViewController
set as rootViewController in AppDelegate. This rootViewController has a UINavigationController
, which has two view controllers pushed on it. When the user presses the home button, the user is logged out. When he later returns to the app, the application calls [UINavigationController popToRootViewControllerAnimated:YES]
and then displays a modal UIViewController
for logging in.
The problem is: When I push/pop on the UINavigationController
normally, my viewWillDisappear
method is called properly. But when I use the popToRootViewControllerAnimated:
method, viewWillDisappear
is not called on any of the viewControllers that are popped off.
Searching on the internet has only given two possible reasons:
view[Will/Did]Disappear
yourselfNone of these suggestions are the case in my app. And I have no idea where to look. Anybody has a suggestion to what has been done wrong in the app?
Upvotes: 18
Views: 20094
Reputation: 1
such useful to me
[nav performSelector:@selector(popToRootViewControllerAnimated:) withObject:nil afterDelay:0.0];
I rewrote UITabBarController
- (void)setSelectedIndex:(NSUInteger)selectedIndex {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
UINavigationController *navigationController = [originalViewController as:[UINavigationController class]];
if (navigationController.presentedViewController) {
[navigationController dismissViewControllerAnimated:NO completion:^{
[navigationController popToRootViewControllerAnimated:NO];
}];
}else if (navigationController.topViewController){
[navigationController popToRootViewControllerAnimated:NO];
}
});
}
Upvotes: 0
Reputation: 113747
The view probably wasn't onscreen. It has to be onscreen (visible) for the viewWillDisappear:
method to be called. If it's coming back from the background, it wasn't visible.
You could try using willMoveToParentViewController:
which is called when the view controller is removed from its parent.
Upvotes: 25