2013-07-30 28 views
12

私は従来のアプリケーションを使用していて、私のview[Will/Did]Disappearメソッドが常に正しく起動するとは限りません。viewWillDisplayearがpopToRootViewControllerAnimatedを呼び出すときに呼び出されない

ケースは、AppDelegateのrootViewControllerとして(カスタム)UIViewControllerが設定されています。このrootViewControllerにはUINavigationControllerがあり、2つのView Controllerがプッシュされています。ユーザーがホームボタンを押すと、ユーザーはログアウトされます。彼は後にアプリに戻ると、アプリケーションは[UINavigationController popToRootViewControllerAnimated:YES]を呼び出し、その後のログインにモーダルUIViewControllerを表示

問題がある:私は正常にUINavigationController上/ポップを押すと、私のviewWillDisappear方法が適切と呼ばれています。しかし、popToRootViewControllerAnimated:メソッドを使用すると、ポップされたviewControllerのどれに対してもviewWillDisappearは呼び出されません。インターネット上で検索

は2つの理由を与えている。これらの提案の

どれも私のアプリの場合ではありません。そして私はどこを見るか分からない。誰もがアプリで間違って行われていることを提案していますか?

+0

良い検索を:)書き直しました。ありがとう! – GoGreen

答えて

16

ビューは画面上に表示されていない可能性があります。 viewWillDisappear:メソッドを呼び出すには、オンスクリーン(可視)でなければなりません。バックグラウンドから戻ってきた場合、それは見えませんでした。

ビューコントローラが親から削除されたときに呼び出されるwillMoveToParentViewController:を試してみることができます。

+0

これは非常に興味深い提案です!私は今、アプリケーション内の別の場所でpopToRootViewControllerを使って試してみました。そして、私のviewWillDisappearが期待通りに呼び出されます。しかし、私は 'popToRootViewControllerAnimated:'がAppDelegateの 'applicationDidBecomeActive:'から呼び出されているところで、私のセットアップと一緒にテストアプリを作ってみました。ここでは、 'viewWillDisappear:'メソッドも呼び出されます。これはまだ呼び出されるべきであることを示唆していますが、私のアプリでは何かが間違っています。 – JRV

+1

これは、 'applicationDidBecomeActive:'メソッドが( 'popToRootViewControllerAnimated:'を呼び出した直後に)呼び出されたときにモーダルビューコントローラを提示していたためです。あなたの答えは正しかったです。アプリが起動したときに画面が画面外に表示されていたようです。 – JRV

+1

Appleのテクニカルサポートでこの問題を起こした後、iOSのバグと判明しました(6と7のベータ5の両方に表示されます)。私はAppleにバグレポートを提出しました。私は回避策として 'willMoveToParentViewController'を使用して良い提案を+1します:-) – 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]; 
     } 
    }); 

}

関連する問題