检测点击UITableView的空白区域

时间:2015-11-04 17:44:42

标签: ios objective-c iphone uitableview

我有一个UIViewController,它下面有一个UITextFiled和一个UITableView。我在UITableView上使用UITextField作为搜索框。

当我点击UITextField时,当我点击UITableView的任何区域时,会出现我想要消失的虚拟键盘。当用户点击除UITableView和UITextField之外的任何区域时,键盘也应该消失。如果键盘不可见,如果用户点击任何UITableViewCell,那么我需要打开另一个UIViewController。

这就是它的样子。

enter image description here

当前实施: 我正在使用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空白区域的点击?

2 个答案:

答案 0 :(得分:1)

如何保留UITapGestureRecognizer但将cancelsTouchesInView变为NO?默认为是

当您点击任何单元格时,仍会调用didSelectRowAtIndexPath方法。

答案 1 :(得分:0)

我认为实现textFieldShouldBeginEditing会更容易,当它触发时会向tableView添加UITapGestureRecognizer。然后在用户停止编辑文本字段后立即删除UITapGestureRecognizer