如何检测UITableView清晰部分的点击?

我有UITableView的视图控制器。 表格视图的高度是静态的,==屏幕的高度。 表中的行数可以更改,有时可能是行数小于可见行数的情况,因此在表底部会出现一些清晰区域。 我可以在没有手势识别器的情况下检测到它吗? 是否有一些UITableView的委托方法?

是的,有委托方法,例如:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

但是,这只会告诉您是否在现有行上进行了点击。 如果要捕获行(或部分标题)下方空白区域的点击,则需要使用手势识别器。 你可以这样做:

 // in viewDidLoad or somewhere similar UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tableTapped:)]; [self.tableView addGestureRecognizer:tap]; //......... - (void)tableTapped:(UITapGestureRecognizer *)tap { CGPoint location = [tap locationInView:self.tableView]; NSIndexPath *path = [self.tableView indexPathForRowAtPoint:location]; if(path) { // tap was on existing row, so pass it to the delegate method [self tableView:self.tableView didSelectRowAtIndexPath:path]; } else { // handle tap on empty space below existing rows however you want } } 

编辑:对于另一种方法,考虑Connor Neville的方法,从他在这篇文章的答案,并将手势识别器添加到表的背景。

所有提供的答案,包括接受的答案,都将UITapGestureRecognizer添加到tableView ; 虽然这会起作用,但我发现这个手势识别器可以干扰行点击并以某种不可预测/不确定的方式触发didSelectRowAtIndexPath

如果你想检测“空白”和行中的点击,我强烈建议你在桌面上添加一个背景视图,并在那里添加手势识别器:

 let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped)) self.tableView.backgroundView = UIView() self.tableView.backgroundView?.addGestureRecognizer(tap) 

感谢@ Stonz2,swift版本:

斯威夫特4

 let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped)) self.tableView.addGestureRecognizer(tap) @objc func tableTapped(tap:UITapGestureRecognizer) { let location = tap.location(in: self.tableView) let path = self.tableView.indexPathForRow(at: location) if let indexPathForRow = path { self.tableView(self.tableView, didSelectRowAt: indexPathForRow) } else { // handle tap on empty space below existing rows however you want } } 

斯威夫特3

 let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped)) self.tableView.addGestureRecognizer(tap) func tableTapped(tap:UITapGestureRecognizer) { let location = tap.location(in: self.tableView) let path = self.tableView.indexPathForRow(at: location) if let indexPathForRow = path { self.tableView(self.tableView, didSelectRowAt: indexPathForRow) } else { // handle tap on empty space below existing rows however you want } } 

斯威夫特2:

 let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped)) self.tableView.addGestureRecognizer(tap) func tableTapped(tap:UITapGestureRecognizer) { let location = tap.locationInView(self.tableView) let path = self.tableView.indexPathForRowAtPoint(location) if let indexPathForRow = path { self.tableView(self.tableView, didSelectRowAtIndexPath: indexPathForRow) } else { // handle tap on empty space below existing rows however you want } } 

您不需要手势识别器。 您应该在ViewController.h ,然后将此方法添加到ViewController.m

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

其中indexPath是单击的行/列的索引。