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は、クラスチェックしたりしてますが、そのへんは省いてます。