TableViewのセルが選択された時のイベント

  • UITableViewDelegate#tableView:didSelectRowAtIndexPath:

の中で

  • UIViewController#presentViewController:animated:completion

を呼んでViewControllerを表示しようとすると異常に遅い。もしくはその待ち状態の間にセルをもう一度選択クリックすると表示されるようになる。

自分のバグだろうかと色々探ったけど理由がわからず・・・以下のようにDelayして実行したら即座に表示されるようになった。

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    MYViewController *con = [[MYViewController alloc] init];
    [self presentViewController:con animated:YES completion:nil];
});

納得がいかずStackoverflowを見ると同じ問題に遭遇している人たちがいて、同じように解決してました。

UITableView and presentViewController takes 2 clicks to display

どうやらiOS 7で仕込まれたバグっぽい。iOS 8でも同様のバグがあります。

  • UITableViewDelegate#tableView:didSelectRowAtIndexPath:
  • UIViewController#presentViewController:animated:completion

の組み合わせで必ず起きるというわけではないみたいです。