如何检测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
是单击的行/列的索引。