【问题标题】:UITapGestureRecognizer vs. didSelectRowAtIndexPath concurrenceUITapGestureRecognizer 与 didSelectRowAtIndexPath 并发
【发布时间】:2017-01-26 06:38:42
【问题描述】:

我有一个点击手势识别器,用于关闭键盘并存储来自文本字段的一些数据。在同一个视图上,我有一个带有 didSelectRowAtIndexPath 的 tableview。当我点击一行时,我的手势识别器被调用而不是 uitableview 方法。我搜索了堆栈溢出并找到了一些我尝试实现的 obj c 解决方案。解决方案是实现cancelsTouchesInView并将其设置为NO。下面是我的点击手势识别器功能,它似乎不起作用。我是不是做错了什么?

func addTapGestureRecognizer(){
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(detailViewController.dismissKeyboard))
    self.view.addGestureRecognizer(tap)
    tap.cancelsTouchesInView = false;
}

这是我的 didSelectRowAtIndexPath

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    print("Stisnut Redak")

    let selectedRowObject = arrayForSteps[indexPath.row]

    if selectedRowObject.status == false {
        tableView.cellForRowAtIndexPath(indexPath)?.accessoryType = .None
    } else {
        tableView.cellForRowAtIndexPath(indexPath)?.accessoryType = .Checkmark
    }

}

【问题讨论】:

    标签: ios swift uitableview uitapgesturerecognizer


    【解决方案1】:

    你可以这样做。 将 BOOL 作为实例变量 isKeyboardActive 并在 textFieldDidBeginEditing 中将其设置为 YES,在 textFieldDidEndEditing 中将其设置为 NO。在viewDidLoad中也设置为NO。

    现在实现这个方法-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 并检查isKeyboardActive 是否为YES。如果是这样,则执行[self.view endEditing:YES]。 如果这不起作用或不需要,请进一步解释您的问题,以便我们提供帮助。

    【讨论】:

      【解决方案2】:

      我实现它的方法是使用:

      func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool
      

      来自 UIGestureRecognizerDelegate 协议的委托方法(您需要确保声明具有表格视图、键盘和文本字段范围的控制器签署此协议)。这将拦截轻击手势并要求函数确定轻击应该由轻击手势识别器还是其他对象处理。

      因此,您在实现此方法时可以做的就是检查以下内容:

      if self.myTableViewController.tableView.frame.contains(touch.location(in: self.view)) {
              return false // The touch will be handled by the table view instead
          }
          return true  // The touch will be handled by the tap gesture recognizer, etc.
      

      这样做的好处是您不必添加任何进一步的代码来处理返回错误的情况,因为触摸将由下一个适当的响应者自动处理。

      (如果您不想使用上述方法,则可以执行此操作的另一种方法是创建一个操作来测试键盘当前是否显示在 viewController 的视图中,并根据该操作决定要采取的操作.)

      希望有帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-01
        • 2012-02-18
        • 2011-11-17
        • 1970-01-01
        • 2011-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多