为什么我的UITableView不响应touchesBegan?

时间:2011-03-21 19:38:07

标签: iphone ios uitableview

我正在使用这种方法

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

如果无法做到这一点 - 还有其他可能性来捕捉“窗外”的触摸吗?

3 个答案:

答案 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];
}