• iOS中添加UITapGestureRecognizer手势识别后,UITableView的didSelectRowAtIndexPath失效


    转自:http://blog.csdn.net/iosevanhuang/article/details/8830499

    今天以前的同事在开发过程中遇到了一个问题,大致描述如下:

    他用TableView写了一个登陆界面,帐号和密码两个Cell中加入了TextField。由于想在TableView的空白处点击时收起键盘,所以他注册了一个UITapGestureRecognizer来识别手势。

    ViewDidLoad中注册手势的部分代码如下:

    [cpp] view plaincopy
     
    1. UITapGestureRecognizer *oneTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyBoard)] autorelease];  
    2. oneTap.delegate = self;  
    3. oneTap.numberOfTouchesRequired = 1;  
    4. [self.view addGestureRecognizer:oneTap];  

    其中hideKeyBoard方法就省略了,基本就是几个resignFirstResponder。

    然后发生了一个奇怪的现象,点击“找回密码”那一栏时没有反应了!!!

    调试后我发现委托方法

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath不执行了。

    目测原因是UITapGestureRecognizer截获了touch事件,导致didSelectRowAtIndexPath方法无法响应。

     

    查阅了相关文档后找到了一种可行的解决方法:重写UIGestureRecognizerDelegate中的

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch方法。

     

    [cpp] view plaincopy
     
    1. #pragma mark - UIGestureRecognizerDelegate  
    2. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch  
    3. {  
    4.     // 输出点击的view的类名  
    5.     NSLog(@"%@", NSStringFromClass([touch.view class]));  
    6.       
    7.     // 若为UITableViewCellContentView(即点击了tableViewCell),则不截获Touch事件  
    8.     if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {  
    9.         return NO;  
    10.     }  
    11.     return  YES;  
    12. }  

    再次调试,这回didSelectRowAtIndexPath响应了,解决UITapGestureRecognizer手势截获Touch事件的问题!

    PS:笔者对Tap手势外其他手势进行了测试,Pinch、Pan、Swipe、Rotation没有产生类似的问题,而Tap和LongPress产生了这样的问题。多谢Doralink提醒,写技术博客还是要写的全面一些。

  • 相关阅读:
    ‘Host’ is not allowed to connect to this mysql server
    centos7安装mysql
    further configuration avilable 不见了
    Dynamic Web Module 3.0 requires Java 1.6 or newer
    hadoop启动 datanode的live node为0
    ssh远程访问失败 Centos7
    Linux 下的各种环境安装
    Centos7 安装 python2.7
    安装scala
    Centos7 安装 jdk 1.8
  • 原文地址:https://www.cnblogs.com/lihaibo-Leao/p/4057385.html
Copyright © 2020-2023  润新知