今天公司的小兄弟问了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; }
而后单击行就能够执行了,如图:事件