tableView 在执行 didSelectRowAtIndexPath 之前由于有一个gestureRecognizer而被隐藏

Posted

技术标签:

【中文标题】tableView 在执行 didSelectRowAtIndexPath 之前由于有一个gestureRecognizer而被隐藏【英文标题】:tableView is hiding due to a gestureRecognizer before it can execute didSelectRowAtIndexPath 【发布时间】:2014-02-02 23:14:23 【问题描述】:

我正在尝试处理 tableViewCell 被窃听,但问题是这是一个“临时 tableView”。我对其进行了编码,以便在用户编辑 UITextField 时它会出现,但随后我设置了一个手势识别器,以便在用户单击远离 UITextField 的某个位置时将 tableview 设置为隐藏。

我的手势识别器设置如下:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                               initWithTarget:self
                               action:@selector(dismissKeyboard)];

[tap setCancelsTouchesInView:NO];
[self.view addGestureRecognizer:tap];

但是,dismissKeyboard 在调用 didSelectRowAtIndexPath 之前被调用,因此我要处理事件的 TableView 被隐藏,因此永远不会调用此函数。

我的问题是:有没有人知道如何解决这个问题,以便 didSelectRowAtIndexPath 在 tableView 隐藏之前执行?我有一个想法以某种方式查看 tableView 是否是点击的来源,如果是,则不要在dismissKeyboard 中执行“hide tableView”行。这可能吗?

抱歉,我是 ios 开发新手,感谢您的建议!

【问题讨论】:

【参考方案1】:

您应该能够通过使您的视图控制器成为点击手势的委托并拒绝它在表格视图内的任何触摸来做到这一点。这是一个起点:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch

    //Assuming your table view is a direct subview of the gesture recognizer's view
    BOOL isInsideTableView = CGRectContainsPoint(tableView.frame, [touch locationInView:gesture.view])
    if (isInsideTableView)
        return NO;

    return YES;

希望这会有所帮助!

【讨论】:

【参考方案2】:

您可以将自己设置为 UITapGestureRecognizer 的委托,并在用户在 tableView 中点击时取消手势。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

     //You can also (and should) check to make sure the gestureRecognizer is the tapGestureRecognizer    
     if (touch.view == tableView)
     
        return NO;
     
     else
     
        return YES;
      

【讨论】:

【参考方案3】:

为了更好地满足您的需求,请判断您的搜索栏是否是第一响应者。

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch


  BOOL isInsideTableView = CGRectContainsPoint(yourTabelView.frame, [touch     locationInView:gesture.view]);

  if (isInsideTableView && ![yourSearchBar isFirstResponder])

      return NO;

  return YES;

【讨论】:

以上是关于tableView 在执行 didSelectRowAtIndexPath 之前由于有一个gestureRecognizer而被隐藏的主要内容,如果未能解决你的问题,请参考以下文章

无法执行 tableView 单元格操作

tableView 在执行 didSelectRowAtIndexPath 之前由于有一个gestureRecognizer而被隐藏

在 TableView 上执行搜索后应用程序崩溃

执行 JSON POST 时重新加载 TableView?

将 tapGesture 添加到 tableView 则无法执行 tableView(_ tableView: UITableView, didSelectRowAt indexPath: Index

通过 tableview 中的按钮进行 segue 执行 2 个 segue 而不是一个