我正在使用这种方法
- (void)tableView:(UITableView *)tableView touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
if ([myPickerView isFirstResponder] && [touch view] != myPickerView) {
[myPickerView resignFirstResponder];
}
[super touchesBegan:touches withEvent:event];
}
但我的tableView没有响应触摸(应用于视图工作,但这由tableView覆盖!)
如果无法做到这一点 - 还有其他可能性来捕捉“窗外”的触摸吗?
答案 0 :(得分:12)
没有tableView:touchesBegan:withEvent:
这样的委托方法。如果您要覆盖-touchesBegan:withEvent:
的{{1}},则需要继承UITableView
。像这样的大多数问题通常使用UITableView
更好地实现。在上面,我可能会使用UIGestureRecognizer
。
答案 1 :(得分:11)
我发现最简单的方法是在UITableViewController的视图中添加一个手势识别器。
我把这段代码放在UITableViewController的viewDidLoad:
中UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[self.view addGestureRecognizer:tap];
并实现了事件处理程序:
- (void)handleTap:(UITapGestureRecognizer *)recognizer
{
// your code goes here...
}
修改强>
您还可以将手势识别器添加到tableview,只需将[self.view addGestureRecognizer:tap];
更改为[self.tableView addGestureRecognizer:tap];
答案 2 :(得分:0)
这是一个适合我的UITableView子类解决方案。创建一个UITableView的子类并覆盖hitTest:withEvent:如下所示:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
static UIEvent *e = nil;
if (e != nil && e == event) {
e = nil;
return [super hitTest:point withEvent:event];
}
e = event;
if (event.type == UIEventTypeTouches) {
NSSet *touches = [event touchesForView:self];
UITouch *touch = [touches anyObject];
if (touch.phase == UITouchPhaseBegan) {
NSLog(@"Touches began");
}
}
return [super hitTest:point withEvent:event];
}