iOS:didSelectRowAtIndexPath:方法失效解決辦法


問題描述及解決過程:

  為了達到點擊TableView空白區退出鍵盤的效果,給控制器注冊了一個UITapGestureRecognizer來識別點擊事件,代碼如下:

 1 #pragma mark - 設置手勢識別器
 2 
 3 - (void)setupGestureRecognizer
 4 {
 5     // 創建手勢識別器對象
 6     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
 7     // 設置手勢識別器對象的代理為當前控制器
 8     tap.delegate = self;
 9     // 添加手勢識別器對象到對應的view
10     [self.view addGestureRecognizer:tap];
11     // 添加監聽方法(識別到了對應的手勢,就會調用監聽方法)
12     [tap addTarget:self action:@selector(tapView)];
13 }
14 
15 - (void)tapView
16 {
17     [self.view endEditing:YES];
18 }

  但之后發現點擊TableView的Cell不能進行跳轉了(在注冊UITapGestureRecognizer之前是可以的),調式發現根本就沒有進入到- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath方法,找到原因后發現是注冊手勢識別器之后,UITapGestureRecognizer截獲了touch事件,通過重寫UIGestureRecognizerDelegate代理中的- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch方法可以自定義在特定的情況下是否截獲touch方法,代碼如下:

 1 # pragma mark - UIGestureRecognizerDelegate
 2 
 3 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
 4 {
 5     // 若為UITableViewCellContentView(即點擊了tableViewCell),則不截獲Touch事件
 6     if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
 7         return NO;
 8     }
 9     
10     return  YES;
11 }

 總結:

  目前就本人經驗來看,如果出現UITableViewCell不能響應點擊事件最先考慮如下兩個原因:

  • 沒有設置UITableView的代理為當前控制器;
  • 如果注冊了手勢識別器,可能是響應者鏈條出了問題,UIGestureRecognizer截獲了touch事件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM