美文网首页iOS高质量博客UIshell
iOS利用响应链机制点击tableview空白处关闭键盘

iOS利用响应链机制点击tableview空白处关闭键盘

作者: 麦克学会了摇滚 | 来源:发表于2015-11-23 23:32 被阅读7586次

写在前面:

    想写博客的想法很久了,由于懒和不知道写什么外,搁置了很久才在今天开始下笔写我的第一篇博客,如果你也是一名iOSer,并且刚好遇到了没有解决的这样的需求,刚好我的我的博客给了你解决问题的灵感,请给个赞哈☺️ 当然如果你有更深的见地或者更好的其他解决的方法,还望不吝赐教哦,大家共同进步(∩_∩)

    好了步入正题,相信在项目中大家对于关闭键盘并不陌生,处理关闭键盘的做法一般分为两种:1.放弃第一响应者身份;2.当前视图结束编辑。通常情况下只要我们在合适的时机去做这两件事的任意一种,都会很稳妥的如我们所愿----关闭键盘。但是,总有那么一些特殊情况使我们不能如意的关闭键盘,比如:在tableviewcell上有一个textfiled或者textview时,我们想要点击背部空白关闭键盘时确不能如愿。现在,我们一步一步的来解决这个问题,首先我们创建一个这样的界面:

    我们在要点击屏幕空白处收起键盘最常见的处理方法是在刚点击的方法中放弃第一响应者身份或者结束编辑,如图

但是运行后发现这个方法不执行,于是我们最常用的而且一用就成功的方法遭遇了tableview这个刺儿头就不灵了。按照我们的理解,只要我们与界面有任何交互运动,touchsBegan的方法就一定会执行,但是我们在这里打断点显示却是没有执行,这是为什么呢?一般在viewController中实现这个方法,点击背景时,这个方法就会执行,于是在tableviewController我们也潜移默化的认为tableviewController下的tableview也会执行这个方法,其实不然,因为tableviewController也是由viewController封装而成,所以真正执行touchsBegan的还是这个viewController下的view。

    好了,既然这样不行,那我们就给tableview加个tap手势吧,代码如下:

   然后我们再次运行程序看看效果。。。。好嘞,终于键盘如愿关闭了,需求解决,不用加班了,于是收拾书包准备回家呗。。。可是产品wang的声音在你即将双脚跨出办公室门外的0.0001秒之前将你叫了回来:“怎么点击cell不能跳转了,还有删除cell也删除不了了?” 于是原本欣喜的心情瞬间如一万头草泥马在心头奔腾而过,回家的愿望破灭了,放下书包继续撸代码。。。。(tap手势覆盖了tableview里面自带的手势,于是就不执行didselect...的方法)

    现在就利用响应链机制来解决这个问题,事件响应链机制我就不在这儿细说了,官方资料讲的很明白了,主要就是查找事件源(调用hitTest...查找)和反馈给系统处理(调用.nextResponse),所以现在我们只需在点击tableview的事件反馈给appdelegate处理之前关闭键盘就可以了,这样既关闭了键盘,又不会由于覆盖tableview封装的手势而导致cell的手势操作异常问题。方法步骤如下:

    1.由于我是用storyboard创建的界面,所以先创建一个继承自UItableview的类,然后与storyboard里面tableview关联。(纯代码一样)

    2.在这个类中实现hitText...的方法如下所示:

这段代码的意思就是点击的是tableview就结束编辑并且返回tableview本身,这样就不影响了tableview本身的操作,然后点击的是tableview的子视图的时候就返回子视图就行了。

    好了,再次运行程序,十指飞快的测试,bingo没问题,背上书包光年速度飞奔回家!

以上内容如有转载请注明出处,同时欢迎大家多多提出意见,还是那句话,大家共同进步,谢谢啦^_^!

相关文章

网友评论

  • 笑谈红尘乱离人:看了评论都没解决我的问题,我解决了:

    UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard:)];
    gestureRecognizer.delegate = self;
    gestureRecognizer.numberOfTapsRequired = 1;
    [self.infoTableView addGestureRecognizer:gestureRecognizer];

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
    return NO;
    }
    return YES;
    }
  • 663008f43837:图自己方便了,多人开发很容易完蛋的
  • 鱼鱼鱼四只鱼:建议你修改成这样。可以解决cell上面的按钮等事件无法响应的问题

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    id view = [super hitTest:point withEvent:event];
    if (![view isKindOfClass:[UITextView class]]) {
    [self endEditing:YES];
    }
    return view;
    }
    Hengry:这招屌屌的
    罗小耳:@geohot 不好意思,是调用系统方法,看到了
  • 9237a556636c:学习了,感谢
  • 65067d1326a2://在UITableView上添加手势 隐藏键盘
    UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyBoard)];
    tapGestureRecognizer.cancelsTouchesInView = NO;//设置成NO表示当前控件响应后会传播到其他控件上,默认为YES。
    -(void)hideKeyBoard
    {
    [_bottomFild endEditing:YES];
    }
    测试有效,并且不会覆盖didselect
    dong_liang:@醋溜草莓便当 这个方法好 :+1:
    麦克学会了摇滚:好的,学到一个技巧了:+1:
    65067d1326a2:@醋溜草莓便当 隐藏方法里 [self.tableView endEditing:YES];这样写就隐藏掉tableview上面的键盘了
  • 神秘用户的蜕变:把手势加在self.view上而不是self.tableView上 可以解决问题
    麦克学会了摇滚:@m5j 当tableview是满屏的时候这样做没效果的
  • 神秘用户的蜕变:用这个办法,didSelect可以执行,可是我cell里的按钮点击事件执行不了了啊
    鱼鱼鱼四只鱼:@m5j 其实只需要改进一下代码便可以。

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    id view = [super hitTest:point withEvent:event];
    if (![view isKindOfClass:[UITextView class]]) {
    [self endEditing:YES];
    }

    return view;
    }
    麦克学会了摇滚:@m5j 这个需要判断谁是响应者
  • 神秘用户的蜕变:代码不是截图多好啊,我就直接copy了呀

本文标题:iOS利用响应链机制点击tableview空白处关闭键盘

本文链接:https://www.haomeiwen.com/subject/iryrhttx.html