如果你曾经在tableView上实现一个可输入的表单,那么一定会遇到键盘隐藏的问题。那一般我们会使用在控制器重写touchBegan: withEvent:方法,然后在方法里面处理如下:
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self.view endEditing:YES];
}
恩,那我们就会立马在管理tableView的控制器上这么去写,然后兴冲冲的run起来~
结果呢,你怎么点都键盘都隐藏不掉,打个断点吧,死活进不去。这时候纳闷了,为什么以前用的好好的,现在却用不了了呢???
这时,我们会想到难道是因为tableView的问题?那让我们来测试下。
测试过程
首先,我们先验证下UITableView/UIScrollView是否可以接受touch事件。
我们新建一个UIViewController,然后添加一个我们自定义的table,在table里面放置的cell也使用我们自定义的cell。在自定义的table和cell里面都重写touchBegan: withEvent:方法。如下
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[[self nextResponder] touchesBegan:touches withEvent:event];
}
为什么要[self nextResponder]呢,根据响应链的规则,如果view在响应到touch事件后不往上层抛出的话,上层的view/viewController是没法响应这个事件的,不太清楚的可以参考响应链
然后在控制器重写touchBegan: withEvent:方法。进行测试。
(因为也没啥难的代码,就不给了~~)
测试结果
我们发现,当你点击cell的空白处的时候,cell可以响应到touch事件,之后会根据响应链传到tableView,再传到控制器。所以其实UITableView/UIScrollView是可以响应touch事件的。
只不过就算我们知道可以这样处理了,但你会这样用吗?我想没人肯这样子吧。其他先不说,单为了处理触摸事件就要搞两个继承,太TM蛋疼了。。。
所以接下来向大家介绍另一个解决办法。
解决办法
上面的介绍只是说明这个方法其实是可以的,真要实际运用的还是建议采用下面的方法。这里要做两个处理(记住,一定是两个处理一起)
处理1
这里跟网上介绍的方法类似,就是在tableView上添加一个手势,然后在手势中添加处理方法。这个方法可以解决当点击tableView空白地方生活,键盘隐藏的问题。但是当滚动table的时候一样是没法处理的。
处理2
UITableView提供了一个属性“keyboardDismissMode”,这个属性默认是“UIScrollViewKeyboardDismissModeNone”就是什么都不做。我们将它设置为“UIScrollViewKeyboardDismissModeOnDrag”,这样在滚动tableView的时候就可以隐藏键盘了