Vic*_*nec 23 objective-c uitableview ios
我有UITableView的视图控制器.表格视图的高度是静态的,==屏幕的高度.表中的行数可以更改,有时可能是行数小于可见行数的情况,因此在表底部会出现一些清晰区域.我可以在没有手势识别器的情况下检测到它吗?是否有一些UITableView的委托方法?
Con*_*nor 42
所有提供的答案,包括接受的答案,添加UITapGestureRecognizer到tableView; 虽然这会起作用,但我发现这个手势识别器可以didSelectRowAtIndexPath以某种不可预测/不确定的方式干扰行抽头和触发.
如果你想检测"空白"和行中的点击,我强烈建议你在桌面上添加一个背景视图,并在那里添加手势识别器:
let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped))
self.tableView.backgroundView = UIView()
self.tableView.backgroundView?.addGestureRecognizer(tap)
Run Code Online (Sandbox Code Playgroud)
Sto*_*nz2 40
是的,有委托方法,例如:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
Run Code Online (Sandbox Code Playgroud)
但是,这只会告诉您是否在现有行上进行了点击.如果要捕获行下方空白区域(或节标题上)的点击,则需要使用手势识别器.你可以这样做:
// 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
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:对于另一种方法,考虑Connor Neville从他在这篇文章中的答案的方法,并将手势识别器添加到表格的背景中.
Rom*_*zak 21
感谢@ 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
}
}
Run Code Online (Sandbox Code Playgroud)
斯威夫特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
}
}
Run Code Online (Sandbox Code Playgroud)
斯威夫特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
}
}
Run Code Online (Sandbox Code Playgroud)