以下のような構造で
UITabBarController
└UINavigationController(タブA)
└UITableViewController (一覧画面)
└UIViewController (詳細画面)
└UINavigationController(タブB)
└UIViewController
手順
(1)タブA表示中に、一覧画面のUITableViewCellをタップして、詳細画面へ遷移
(2)タブB(TabBarItem)をタップした後、またタブAに戻る
(3)タブAでは、詳細画面が表示されている
(4)タブAが表示された状態で、タブA(TabBarItem)を押す
(5)詳細画面が一覧画面にPOPする
上記(5)の動作を止める為にはどうしたらよいかハマっていました
解決策
UITabBarControllerのサブクラス内
デリゲートメソッドでタブ切り替えのキャンセル処理
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)
{
UINavigationController *nav = (UINavigationController *)viewController;
if ([NSStringFromClass([nav.viewControllers[0] class]) isEqualToString:@"詳細画面のクラス名文字列"]) {
if ([nav.viewControllers count] == 2 && selectedController == viewController) {
return NO;
}
}
return YES;
}
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
if (selectedController != viewController) {
selectedController = viewController;
}
}