關閉鍵盤致使tableView:didSelectRowAtIndexPath:失效解決辦法

今天公司的小兄弟問了tableView:didSelectRowAtIndexPath:不能執行的問題。app

  從經驗看以爲多是控制器沒有成爲tableView的代理所致。但代碼中已經添加了代碼ide

    _tableView.delegate = self;
    _tableView.dataSource = self;

  因此通過分析控制器的代碼,發現多是關閉鍵盤的方法所致ui

    [self.view bk_whenTapped:^{
        [self.view endEditing:YES];
    }];

  tableView:didSelectRowAtIndexPath:應該也是處理的單擊事件的行爲,因此致使手勢被self.view截取,當去除以上代碼後,tableView:didSelectRowAtIndexPath:能順利被代理調用。可是按事件傳遞順序是從下往上,從父視圖傳遞到子視圖執行的話,也應該是cell 處理單擊事件纔是,多是tableView:didSelectRowAtIndexPath:內部實現作了些處理吧。總之問題出在這裏,先解決問題吧,更深刻的緣由等之後再作解釋。寫了這個Demo來解決問題。demo下載地址:http://pan.baidu.com/s/1hqTPyO8spa

 

 

解決辦法代理

  1.經過一番查找,發現能夠用如下方法關閉鍵盤,而後並讓控制器成爲單擊手勢的代理。code

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard:)];
    tap.delegate = self;
    tap.numberOfTapsRequired = 1;
    [self.view addGestureRecognizer:tap];
}

  2.實現手勢代理方法 blog

#pragma mark - UIGestureRecognizerDelegate
//
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    
    if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
        return NO;
    }
    
    return YES;
}

  而後單擊行就能夠執行了,如圖:事件

相關文章
相關標籤/搜索