ViewWillDisappear не вызывается при вызове popToRootViewControllerAnimated
Я работаю над устаревшим приложением и обнаружил, что мои методы view[Will/Did]Disappear
не всегда срабатывают должным образом.
В случае, у меня есть (custom) UIViewController
, установленный как rootViewController в AppDelegate. Этот rootViewController имеет UINavigationController
, который имеет два контроллера отображения. Когда пользователь нажимает кнопку "домой", пользователь выходит из системы. Когда он позже вернется в приложение, приложение вызывает [UINavigationController popToRootViewControllerAnimated:YES]
, а затем отображает модальный UIViewController
для входа.
Проблема заключается в следующем: когда я обычно нажимаю/нажимаю на UINavigationController
, мой метод viewWillDisappear
вызывается правильно. Но когда я использую метод popToRootViewControllerAnimated:
, viewWillDisappear
не вызывается ни на один из обработчиков viewControllers.
Поиск в Интернете имеет только две причины:
Ни одно из этих предложений не относится к моему приложению. И я понятия не имею, где искать. У кого-нибудь есть предложение о том, что было сделано неправильно в приложении?
Ответы
Ответ 1
Вероятно, этот вид не был на экране. Он должен быть на экране (видимым) для метода viewWillDisappear:
, который должен быть вызван. Если он возвращается с фона, он не был виден.
Вы можете попробовать использовать willMoveToParentViewController:
, который вызывается, когда контроллер вида удален из его родителя.
Ответ 2
такой полезный для меня
[nav performSelector:@selector(popToRootViewControllerAnimated:) withObject:nil afterDelay:0.0];
Я переписал 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];
}
});
}