[Xcode] UITabBarControllerモーダル時の不具合対応

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

シェアする

  • このエントリーをはてなブックマークに追加

フォロミー

コメントをどうぞ

メールアドレスが公開されることはありません。