0

ユーザーがすでに選択されている同じタブバー項目をタップしたときに、 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: をサインイン コントローラーに実装して、タップされたバー項目のルート コントローラーが同じかどうか、およびそのコントローラーがコントローラーのクラスであるかどうかを確認します。それだけでなく、サインイン コントローラーは、ナビゲーション スタックにプッシュできるコントローラーのクラスを認識している必要があります。プロトコル メソッドを引き続き使用できますが、これを行うためのより良い方法があるはずです。

ご意見やアイデアをお寄せいただきありがとうございます。

4

1 に答える 1

1

この問題の最善の解決策は、タブバーボタンが選択されたときにモーダルビューコントローラーを表示し、NOを返すことだと思います。デリゲートメソッドから。

于 2012-07-25T02:44:43.697 に答える