UITabBarControllerをモーダルで呼んだ場合。
UITabBarControllerに複数のナビゲーションViewを配置し、そのナビの中で、push遷移が行われる場合。
pushさせてすぐに、そのナビのタブボタンをタップすると、popが発生し、ナビ内のViewが壊れる。
nested pop animation can result in corrupted navigation bar
Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.
このエラーは、遷移後のViewの、viewDidAppearの前にpopすると発生するようだ。
モーダルではなく、UITabBarControllerをself.window.rootViewControllerとしたアプリでは発生しない。
この場合は、遷移中にタブボタンをタップしても反応はなく、遷移が終わらないとタブボタンからのpopが発生しない。
まったく同じUITabBarControllerクラスで上記の挙動なので困った。
もうちょっと試しつつも、独自のタブを作ろうか、対応を考え中。
こういった呼び方は結構ありそうなので、こちらの実装ミスなのかもしれないけれど。
・・・対応してみました。
*対象のナビクラスにフラグ設置
@property (nonatomic,assign) BOOL blDidAppear;
*ナビ内のViewController
ViewDidLoadで、
((ナビクラス*)self.navigationController).blDidAppear = NO;
表示されたらフラグを立てる。
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
((ナビクラス*)self.navigationController).blDidAppear = YES;
}
*UITabBarControllerの呼びもとで
UITabBarControllerDelegateメソッドの実装
参照できる場所に定義 id selectedTab;
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
// 選択されたviewを保持
selectedTab = viewController;
// その他処理
}
//タブボタンタップ時
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
if(selectedTab == viewController){
// 同じタブ選択時
if(!((ナビクラス*)viewController).blDidAppear){
// viewDidAppearに到達していない場合、NO
return NO;
}
}
return YES;
}
これで期待通りの動作に。
対処のviewControllerは、クラスチェックしたりしてますが、そのへんは省いてます。