ユーザーがすでに選択されている同じタブバー項目をタップしたときに、 popToRootViewControllerAnimated: (現在: YES) のアニメーションをオーバーライドしたいと思います。
タブ バー アイテムが最初にタップされたとき、タブ バー アイテムのルート ビュー コントローラーの viewWillAppear: メソッドでユーザーがサインインしているかどうかを確認し、サインインしていない場合は、アニメーションを無効にしてサインイン コントローラーをすぐにプッシュします。
controller.navigationItem.hidesBackButton = YES;
[self.navigationController pushViewController:controller animated:NO];
[controller release];
ユーザーがサインインに成功すると、ルート コントローラーに戻ります。[アニメーションは] 問題ありません。
[self.navigationController popViewControllerAnimated:YES];
ただし、現在のタブ バー項目を再度タップしたときのデフォルトの動作は、次の呼び出しを行うように見えます。
-[UITabBarController _tabBarItemClicked:]
呼び出す
-[UINavigationController popToRootViewControllerAnimated:]
最後の 1 つに YES が渡されたかどうかはわかりませんが、観察に基づいてそうであると仮定します。ユーザーがサインインせずにタブ バー項目をもう一度タップすると、ルート コントローラーの viewDidLoad がサインイン コントローラーを再度プッシュするだけなので、同じ [サインイン] コントローラーがアニメーションでプッシュ/ポップされているように見えます。 . この 1 つのケースでは、アニメーションを NO にしたいと思います。
私の問題に加えて、サインイン コントローラーをプッシュできる他のナビゲーション スタックがあり、そのタブ バー項目をタップしてルート コントローラーにポップするのが適切です。UITabBarControllerDelegate プロトコルと tabBarController:shouldSelectViewController: をサインイン コントローラーに実装して、タップされたバー項目のルート コントローラーが同じかどうか、およびそのコントローラーがコントローラーのクラスであるかどうかを確認します。それだけでなく、サインイン コントローラーは、ナビゲーション スタックにプッシュできるコントローラーのクラスを認識している必要があります。プロトコル メソッドを引き続き使用できますが、これを行うためのより良い方法があるはずです。
ご意見やアイデアをお寄せいただきありがとうございます。