7

リモート Web サービスへのタイムアウトを処理するために UIViewControllers に実装したデリゲート/ハンドラーがあります。Web サービスに対してリクエストが行われ、タイムアウトの http コードが返されると、デリゲートが呼び出され、次の処理が実行されます。

UINavigationController *navController = self.navigationController;

if (navController) {
    [navController popToRootViewControllerAnimated:YES];
} else {
    NSLog(@"navController is null/nil");
}

次の手順を実行するnavControllerと、正しくインスタンス化され、popToRootViewControllerアクションが発生します。

  1. Login ViewController の Web サービスでアプリを認証する
  2. CustomMenuViewController へのセグエを自動トリガーする
  3. Web サービスがリモートでタイムアウトするのを待ちます
  4. クリックして、CustomSubMenuViewController へのセグエをトリガーします

ここで、次の手順を実行すると、何らかの理由で navController が正しく設定されていないため、上記のコード ブロックの else 句がトリガーされます。

  1. CustomLoginViewController の Web サービスでアプリを認証する
  2. CustomMenuViewController への自動セグエ
  3. すぐにクリックして、CustomSubMenuViewController へのセグエをトリガーします
  4. 戻るボタンをクリックしてポップをトリガーする
  5. Web サービスがリモートでタイムアウトするのを待ちます
  6. クリックして、同じ CustomSubMenuViewController へのセグエをトリガーします

私の質問は、ViewController を 2 回目にロードしたときに、self.navigationController が null を返すのはなぜですか?

上記の例のコール スタックは次のようになります。 NavigationController -> CustomLoginViewController -> CustomMenuViewController -> CustomSubMenuViewController

ありがとう

更新: この問題についてはまだ進展がありません!

4

2 に答える 2

2

これは非常に基本的なことのように聞こえるかもしれませんが、Navbar オブジェクトを正しく割り当てましたか? そのプロパティを strong に設定してみてください。

于 2013-10-01T06:59:02.617 に答える
1

あなたはすでにこれを解決しているかもしれないと思いますが、まったく同じことに遭遇しました。また、Facebook をログインに使用するなど、まったく同じことを行っている可能性があると思います。とにかく、将来の誰かにとって、これは役に立つかもしれません。障害状態でバックグラウンドから戻ったときに、 UINavigationController を再度割り当てていたという問題がありました。

したがって、できることは、UiNavigationController の rootViewController を初期化する場所の周りにブレークポイントを配置することです。

 [[UINavigationController alloc]
        initWithRootViewController:viewController]; and make sure that you do re-initailise your UINavigationController if you have already done it.
于 2014-10-08T21:36:29.910 に答える