• 关闭键盘导致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;
    }

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

     

  • 相关阅读:
    spring mvc 返回json
    spring mvc 解决后台传递值乱码问题
    sring mvc 返回值至jsp界面的几种方式
    spring mvc 注解访问控制器以及接收form数据的方式,包括直接接收日期类型及对象的方法
    spring mvc 通过配置xml访问控制器的三种方式
    spring mvc 入门配置
    HBase 学习笔记
    Centos搭建Linux测试环境,几个基本的设置项
    kafka 集群安装与安装测试
    Kafka 分布式消息队列介绍
  • 原文地址:https://www.cnblogs.com/JackieHoo/p/5267680.html
Copyright © 2020-2023  润新知