didSelectRowAtIndexPath:方法失效解决办法

为了达到点击TableView空白区退出键盘的效果,给控制器注册了一个UITapGestureRecognizer来识别点击事件,代码如下:

#pragma mark - 设置手势识别器

- (void)setupGestureRecognizer
{
  // 创建手势识别器对象
  UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];

  // 设置手势识别器对象的代理为当前控制器
  tap.delegate = self;

  // 添加手势识别器对象到对应的view
  [self.view addGestureRecognizer:tap];

  // 添加监听方法(识别到了对应的手势,就会调用监听方法)
  [tap addTarget:self action:@selector(tapView)];
}

- (void)tapView
{
  [self.view endEditing:YES];
}

但之后发现点击TableView的Cell不能进行跳转了(在注册UITapGestureRecognizer之前是可以的),调式发现根本就没有进入到didSelectRowAtIndexPath方法,找到原因后发现是注册手势识别器之后,UITapGestureRecognizer截获了touch事件,通过重写UIGestureRecognizerDelegate代理中的shouldReceiveTouch方法可以自定义在特定的情况下是否截获touch方法,代码如下:

# pragma mark - UIGestureRecognizerDelegate

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
  // 若为UITableViewCellContentView(即点击了tableViewCell),则不截获Touch事件
  if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
    return NO;
  }
  return  YES;
}

总结:
目前就本人经验来看,如果出现UITableViewCell不能响应点击事件最先考虑如下两个原因:
1.没有设置UITableView的代理为当前控制器;
2.如果注册了手势识别器,可能是响应者链条出了问题,比如 UIGestureRecognizer截获了touch事件。

你可能感兴趣的:(didSelectRowAtIndexPath:方法失效解决办法)