为什么我的UITableView不响应touchesBegan?

我正在使用这种方法

- (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覆盖!)

如果这是不可能的 – 有没有其他可能捕获“窗外”触摸?

没有像tableView:touchesBegan:withEvent:这样的委托方法tableView:touchesBegan:withEvent: . 如果要覆盖-touchesBegan:withEvent:对于UITableView ,则需要-touchesBegan:withEvent: UITableView 。 像这样的大多数问题通常使用UIGestureRecognizer更好地实现。 在上面,我可能会使用UITapGestureRecognizer

我发现最简单的方法是在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]; to [self.tableView addGestureRecognizer:tap];

这是一个适合我的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]; }