2011-03-21 369 views
2

我使用这种方法为什么我的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盖的!)

如果这是不可能的 - 有捕获“窗外”触摸的任何其他可能性?

+1

这不是您如何编写'touchesBegan'方法。它不会将您的表视图作为第一个参数。 – BoltClock 2011-03-21 19:43:08

回答

11

有没有这样的代表方法tableView:touchesBegan:withEvent:。如果您想为您的UITableView覆盖-touchesBegan:withEvent:,则需要继承UITableView。大多数这样的问题往往更好地实施与UIGestureRecognizer。在上面,我可能会使用UITapGestureRecognizer

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];

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]; 
} 
相关问题