UITapGestureRecognizer与didSelectRowAtIndexPath并发

时间:2016-09-18 14:06:07

标签: ios swift uitableview uitapgesturerecognizer

我有一个轻击手势识别器,用于解除键盘并存储文本字段中的一些数据。在同一个视图中,我有一个带有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
    }

}

2 个答案:

答案 0 :(得分: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视图中显示键盘,并根据该操作决定采取什么操作。)

希望有所帮助!

答案 1 :(得分:1)

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

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