为什么我的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]; }