開発メモ

開発メモ

ナビゲーションでの戻るボタンによるアプリのクラッシュ

iOS7になってから、UINavigationControllerを使用したアプリケーションで、 画面遷移中に戻るボタンを押すと、UIが更新されない問題が発生した。 (画面遷移中に左上を連打していると簡単に再現される。)

原因は、おそらくだがiOS7になってから、 ナビゲーションバーのボタンなどもスライドインのアニメーションがつき、 アニメーション中に戻るボタンが押せてしまうからなのではないかと思われる。

とりあえず、viewWillAppear:でボタンを使用不能にし、 viewDidAppear:でボタンを使用可能にした。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    // 戻るボタンを無効化する
    UIView *tmpBackView = [[UIView alloc] initWithFrame:CGRectZero];
    [tmpBackView setBackgroundColor:[UIColor clearColor]];
    UIBarButtonItem *tmpBackButton = [[UIBarButtonItem alloc] initWIthCustomView:tmpBackView];
    [tmpBackButton setEnabled:NO];
    [self.navigationItem setLeftBarButtonItem:tmpBackButton];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    
    [UIView animateWithDuration:0.3f animations:^{
        [self.navigationItem setLeftBarButtonItem:nil];
    }];
}

戻るボタンが瞬間的に現れるのもどうかと思ったので、viewDidAppear:では、 アニメーション付きで戻している。

また、この方法を使用すると、leftBarButtonItemをカスタムしている場合に、 そいつを戻るボタンに変更してしまうので、 メンバ変数にtmpBackButtonを放り込んで置いて、判定をかけるとかしているのだが、 他に良い方法があったりするだろうか?