zoukankan      html  css  js  c++  java
  • 关闭键盘导致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;
    }

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

     

  • 相关阅读:
    .NET 统一用户管理 -- 统一鉴权
    .NET 统一用户管理 -- 单点登录
    基于.net 职责链来实现 插件模式
    电商开放平台设计
    docker搭建一个渗透测试环境 bwapp为例
    dcoker运行msf
    关于构造靶场
    判断网站是不是真实ip
    H3C设备配置ARP攻击防御
    Java代码审计 HTTP头操纵 response.addHeader()
  • 原文地址:https://www.cnblogs.com/JackieHoo/p/5267680.html
Copyright © 2011-2022 走看看