iPhone
iOS

UITableViewの、どのセルをロングタップしたかを知りたいとき

More than 3 years have passed since last update.
仕込み
// 適当なタイミングでUITableViewにUILongPressGestureRecognizerをaddする
- (void)hoge {

    UILongPressGestureRecognizer *longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(fuga:)];
    [_tableView addGestureRecognizer:longPressGestureRecognizer];

}


本題
- (void)fuga:(UILongPressGestureRecognizer*)gestureRecognizer {
    // ロングタップの開始時だけこのメソッドを実行する
    if (gestureRecognizer.state != UIGestureRecognizerStateBegan) {
        return;
    }

    // UILongPressGestureRecognizerからlocationInView:を使ってタップした場所のCGPointを取得する
    CGPoint p = [gestureRecognizer locationInView:_tableView];
    // 取得したCGPointを利用して、indexPathForRowAtPoint:でタップした場所のNSIndexPathを取得する
    NSIndexPath *indexPath = [_tableView indexPathForRowAtPoint:p];
    // NSIndexPathを利用して、cellForRowAtIndexPath:で該当でUITableViewCellを取得する
    UITableViewCell *cell = [_tableView cellForRowAtIndexPath:indexPath];
}


という感じで、ロングタップした場所の座標から取得したNSIndexPathを利用してUITableViewCellを取得することが出来ます。