今天公司的小兄弟問了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; }
而後單擊行就能夠執行了,如圖:事件