2013-07-30 5 views
12

Я работаю над устаревшим приложением и обнаружил, что мои методы view[Will/Did]Disappear не всегда срабатывают должным образом.viewWillDisappear не вызывается при вызове popToRootViewControllerAnimated

Дело в том, что у меня есть (пользовательский) UIViewController как rootViewController в AppDelegate. Этот rootViewController имеет UINavigationController, который имеет два контроллера отображения. Когда пользователь нажимает кнопку «домой», пользователь выходит из системы. Когда позже он возвращается в приложение, приложение вызывает [UINavigationController popToRootViewControllerAnimated:YES], а затем отображает модальное UIViewController для регистрации в

Проблема в том. Когда я нажимаю/поп на UINavigationController нормально, мой метод viewWillDisappear называется правильно. Но когда я использую метод popToRootViewControllerAnimated:, viewWillDisappear не вызывается ни на один из наблюдаемых колл-мониторов.

Поиск в Интернете только дал две возможные причины:

Ни одно из этих предложений не являются случай в моем приложении. И я понятия не имею, где искать. У кого-нибудь есть предложение о том, что было сделано неправильно в приложении?

+0

хорошая находка :). Благодаря! – GoGreen

ответ

16

Вид, вероятно, не был на экране. Он должен быть на экране (видимым) для вызываемого метода viewWillDisappear:. Если он возвращается с фона, он не был виден.

Вы можете попробовать использовать willMoveToParentViewController:, который вызывается, когда контроллер вида удален из его родителя.

+0

Это очень интересное предложение! Теперь я попытался использовать popToRootViewController в другом месте приложения, а затем мой viewWillDisappear вызывается как ожидалось, поэтому вы правы до сих пор. Тем не менее, я также попытался создать тестовое приложение с точно такой же настройкой, где 'popToRootViewControllerAnimated :' вызывается из приложения AppDelegate' applicationDidBecomeActive: '. Здесь также вызывается метод viewWillDisappear:. Это все еще предполагает, что его следует называть, но что-то не так в моем приложении. – JRV

+1

Причиной этого было то, что я представлял контроллер модального представления, когда был вызван метод «applicationDidBecomeActive:» (сразу после вызова 'popToRootViewControllerAnimated:'). Таким образом, ваш ответ был прав - вид, по-видимому, был отключен от экрана при запуске приложения. – JRV

+1

После того, как эта проблема возникла при технической поддержке Apple, она оказалась ошибкой в ​​iOS (и она появляется как в 6, так и в 7 Beta 5). Я подал отчет об ошибке Apple. Я даю вам +1 за хорошее предложение, используя 'willMoveToParentViewController' в качестве обходного пути :-) – JRV

0

такой полезный для меня

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

}

Смежные вопросы