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];
        }
    });

}