何かを見つけた: Tabbar を NavigationController (スタック上にいくつかのビューがある) と組み合わせて、TabBarItem をダブルクリックすると、好きかどうかにかかわらず、ビューが最初の ViewController にポップします。
これを防ぐ方法はありますか?
何かを見つけた: Tabbar を NavigationController (スタック上にいくつかのビューがある) と組み合わせて、TabBarItem をダブルクリックすると、好きかどうかにかかわらず、ビューが最初の ViewController にポップします。
これを防ぐ方法はありますか?
おそらく、この動作を防止するべきではありません。これは、ステータス バーをタップしてスクロール ビューの一番上までスクロールするような、標準の iPhone UI 規則です。
本当にやりたい場合は、mckeed が述べたようにUITabBarController
デリゲート メソッドを実装する必要があります。-tabBarController:shouldSelectViewController:
ただし、5 つ以上のタブがあるselectedViewController
場合は、[その他] セクションにあるビュー コントローラーである可能性がありますがvc
、[UITabBarController moreNavigationController]
. その場合を処理する実装を次に示します。
- (BOOL)tabBarController:(UITabBarController *)tbc shouldSelectViewController:(UIViewController *)vc {
UIViewController *selected = [tbc selectedViewController];
if ([selected isEqual:vc]) {
return NO;
}
if ([vc isEqual:[tbc moreNavigationController]] &&
[[tbc viewControllers] indexOfObject:selected] > 3) {
return NO;
}
return YES;
}
私は自分でこの問題に遭遇し、それを行う方法を見つけました。UITabBarController のデリゲートを作成しtabBarController:shouldSelectViewController:
、同じコントローラーを選択しないように実装します。
- (BOOL) tabBarController:(UITabBarController *)tbc shouldSelectViewController:(UIViewController *)vc {
return tbc.selectedViewController != vc;
}
場合によってのみ防止したい場合は、より複雑なロジックを追加することもできます。
これまでに見つけた唯一の方法は、UINavigationControllerのサブクラスを作成し、popToRootViewControllerAnimatedメソッドを上書きしてnilを返すことです。
これは、UITabBarが2回タブ付けされたときに呼び出すメソッドのようです。それが正しい方法かどうかはわかりませんが...この問題に関するフィードバックをお待ちしています...
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated {
return nil;
}
私はこの意図した動作を維持することに同意しますが、同時に、VCスタックを適切に巻き戻すことで面白くなります(ネストされた一連のコアデータオブジェクトを編集する場合など)。私の場合、各VCをキャンセルするのと同じです。
したがって、ルートVCまでポップしていることを知る方法はありますか?viewWillDisappear中のキャンセル/ロールバック操作はそれをカットしないと思います。なぜなら、同じビューは保存後にも確実に消えてしまうからです。どういうわけか「キャンセルします-救済します!」を放送する必要があります。特定のタブでルートVCまでポップするとき。正当なキャンセルの場合(つまり、キャンセルボタンが実際にタップされた場合)、そのテストが2回呼び出されるため、viewWillDisappear内の安全チェックとしてダーティ/新しいフラグをチェックすることも役に立ちません。