【问题标题】:tableView is hiding due to a gestureRecognizer before it can execute didSelectRowAtIndexPathtableView 在执行 didSelectRowAtIndexPath 之前由于有一个gestureRecognizer而被隐藏
【发布时间】: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 开发新手,感谢您的建议!

【问题讨论】:

    标签: ios iphone objective-c uitableview uitapgesturerecognizer


    【解决方案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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-09-17
          • 2016-04-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多