华过的痕迹

关闭键盘导致tableView:didSelectRowAtIndexPath:失效解决办法

今天公司的小兄弟问了tableView:didSelectRowAtIndexPath:不能执行的问题。

  从经验看觉得可能是控制器没有成为tableView的代理所致。但代码中已经添加了代码

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

  所以经过分析控制器的代码,发现可能是关闭键盘的方法所致

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

  tableView:didSelectRowAtIndexPath:应该也是处理的单击事件的行为,所以导致手势被self.view截取,当去除以上代码后,tableView:didSelectRowAtIndexPath:能顺利被代理调用。但是按事件传递顺序是从下往上,从父视图传递到子视图执行的话,也应该是cell 处理单击事件才是,可能是tableView:didSelectRowAtIndexPath:内部实现做了些处理吧。总之问题出在这里,先解决问题吧,更深入的原因等以后再做解释。写了这个Demo来解决问题。demo下载地址:http://pan.baidu.com/s/1hqTPyO8

 

 

解决办法

  1.通过一番查找,发现可以用以下方法关闭键盘,然后并让控制器成为单击手势的代理。

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

  2.实现手势代理方法 

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

  然后单击行就可以执行了,如图:

 

posted on 2016-03-11 23:59  华过的痕迹  阅读(866)  评论(0编辑  收藏  举报

导航