我有一个UIViewController,它下面有一个UITextFiled和一个UITableView。我在UITableView上使用UITextField作为搜索框。
当我点击UITextField时,当我点击UITableView的任何区域时,会出现我想要消失的虚拟键盘。当用户点击除UITableView和UITextField之外的任何区域时,键盘也应该消失。如果键盘不可见,如果用户点击任何UITableViewCell,那么我需要打开另一个UIViewController。
这就是它的样子。
当前实施: 我正在使用UITapGestureRecognizer来检测点击位置。此外,我正在使用shouldReceiveTouch来查找触摸是否在UITableView上。如果是,那么我返回NO,这意味着我忽略了UITableView上的触摸。如果没有,那么我返回YES并在UITapGestureRecognizer处理程序中我通过调用
解雇键盘 [self.searchTextField resignFirstResponder];
现在我遇到的问题是:当我的UITableView没有足够的数据并且它只显示1或2个单元格时,那么在这种情况下我希望键盘在我点击时被解除UITableView的空白区域,但它不会因为UITableView上的水龙头和shouldReceiveTouch将返回NO并忽略触摸。
注意我首先实现shouldReceiveTouch的原因是我希望当用户点击任何单元格时自动调用didSelectRowAtIndexPath函数。只有当我忽略UITableView上的Tapgesture时才有可能。
我尝试了另外一种方法,其中我没有实现shouldReceiveTouch,并且在每次点击时我都调用了UITapGestureRecognizer处理程序并且正在检测触摸是否在UITableView内部。在那种情况下,我没有得到正确的行索引。这就是我实现它的方式:
-(void)dismissKeyboard:(UITapGestureRecognizer *)tap
{
if([self.searchTextField isFirstResponder])
{
[self.searchTextField resignFirstResponder];
return;
}
CGPoint location = [tap locationInView:self.view];
if(touchedOutsideUITableView)
return;
NSIndexPath *path = [self.lotsTableView indexPathForRowAtPoint:location];
if(path)
{
// user taps on existing row
[self tableView:self.lotsTableView didSelectRowAtIndexPath:path];
}
else
{
// handle tap on empty area of UITableView
}
}
有人可以告诉我如何在当前实现中检测UITableView空白区域的点击?
答案 0 :(得分:1)
如何保留UITapGestureRecognizer但将cancelsTouchesInView变为NO?默认为是
当您点击任何单元格时,仍会调用didSelectRowAtIndexPath方法。
答案 1 :(得分:0)
我认为实现textFieldShouldBeginEditing
会更容易,当它触发时会向tableView添加UITapGestureRecognizer
。然后在用户停止编辑文本字段后立即删除UITapGestureRecognizer
。