2011-03-21 368 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]; 
} 
相關問題