1. 程式人生 > >IOS 不能觸發didSelectRowAtIndexPath事件的原因

IOS 不能觸發didSelectRowAtIndexPath事件的原因

IOS 不能觸發didSelectRowAtIndexPath事件
今天遇到這個問題,在網上找到了答案,紀錄一下

可能原因:

  • delegate沒有設定。
  • 可能tableview被其他控制元件覆蓋。
  • 新增UITapGestureRecognizer手勢識別後,UITableView的didSelectRowAtIndexPath失效,兩者之間手勢發生衝突。

答案:

  • 前兩種情況有沒有問題,有的話解決掉,沒有就跳過。
  • 如果前兩種情況都不是,那看看是不是你在什麼地方添加了手勢,如果添加了可能原因是:
    UITapGestureRecognizer截獲了touch事件,導致didSelectRowAtIndexPath方法無法響應。

    查閱了相關文件後找到了一種可行的解決方法:重寫UIGestureRecognizerDelegate中的- (BOOL)gestureRecognizer:(UIGestureRecognizer )gestureRecognizer shouldReceiveTouch:(UITouch )touch方法。
    重寫內容如下:
- (void)viewDidLoad
 {//註冊手勢的部分程式碼如下:
    [super viewDidLoad];
UITapGestureRecognizer *oneTap = [[[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(hideKeyBoard)] autorelease]; oneTap.delegate = self; oneTap.numberOfTouchesRequired = 1; [self.view addGestureRecognizer:oneTap]; }
#pragma mark - UIGestureRecognizerDelegate  
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch  
{  
    // 輸出點選的view的類名  
NSLog(@"%@", NSStringFromClass([touch.view class])); // 若為UITableViewCellContentView(即點選了tableViewCell),則不截獲Touch事件 if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) { return NO; } return YES; }

再次除錯,這回didSelectRowAtIndexPath響應了,解決UITapGestureRecognizer手勢截獲Touch事件的問題!