带有cancelsTouchesInView=false的iOS AddGestureRecognitor不适用于子视图按钮

带有cancelsTouchesInView=false的iOS AddGestureRecognitor不适用于子视图按钮,ios,swift,uigesturerecognizer,Ios,Swift,Uigesturerecognizer,我用以下方式实现了带有UIGestureRecognitor的ViewController: // Extension for GestureRecognizer extension UIViewController { func addGestureRecognizer() { let singleTap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))

我用以下方式实现了带有UIGestureRecognitor的ViewController:

// Extension for GestureRecognizer
extension UIViewController {
    func addGestureRecognizer() {
        let singleTap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
        singleTap.cancelsTouchesInView = false
        singleTap.numberOfTapsRequired = 1
        self.view.addGestureRecognizer(singleTap)
    }

    @objc func handleTap(_ recognizer: UITapGestureRecognizer) {
        self.view.endEditing(false)
    }
}
如您所见,默认情况下,cancelsTouchesInView设置为false。它适用于带有搜索栏和文本字段的主视图。键盘被关闭,触摸被转换成视图的对象——按钮等等

但我添加了子视图,它的工作方式类似于AlertView,带有几个UITextFields和UIButton。这里有一个问题。当显示子视图时,我点击该子视图的任何按钮-手势识别器会做出反应,键盘消失。但没有其他事情发生。所以我必须第二次点击按钮才能按下。

我已尝试将UITapGestureRecognitizer的目标从self更改为self.mySubViewName,如下所示:

    func addGestureRecognizer() {
        let singleTap = UITapGestureRecognizer(target: self.addingItemView, action: #selector(self.handleTap(_:)))
        singleTap.cancelsTouchesInView = false
        singleTap.numberOfTapsRequired = 1
        self.view.addGestureRecognizer(singleTap)
    }

    @objc func handleTap(_ recognizer: UITapGestureRecognizer) {
        self.view.endEditing(false)
    }
通过这种方式,手势识别器开始正确使用子视图按钮,但无法使用主视图。例如,当我尝试关闭搜索栏的键盘时,我开始出现“发送了无法识别的选择器”错误。我曾尝试为子视图实现单独的函数AddGestureRecognitizerForSubview,但仍然出现“发送了无法识别的选择器…”错误

还尝试添加以下内容:

extension MenuTableViewController: UIGestureRecognizerDelegate {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        return touch.view == self.addingItemView
    }
}
但一切都没有改变


我在这里检查了很多答案,但没有找到我的案例。有人能提供建议吗?我可以共享我的ViewController类,但是它太重了,并且通过编程添加的子视图看起来很难看:)

在警报后面添加一个子视图,并向其添加手势,而不是
self.view

    let singleTap = UITapGestureRecognizer(target: self.otherView, action: #selector(self.handleTap(_:)))
    singleTap.cancelsTouchesInView = false
    singleTap.numberOfTapsRequired = 1
    self.otherView.addGestureRecognizer(singleTap)
编辑:您建议将其添加到子视图是正确的

    let singleTap = UITapGestureRecognizer(target: self.addingItemView, action: #selector(self.handleTap(_:)))
    singleTap.cancelsTouchesInView = false
    singleTap.numberOfTapsRequired = 1
    self.view.addGestureRecognizer(singleTap)
但您仍然在这里将手势添加到self.view

      self.view.addGestureRecognizer(singleTap)
改为

      self.addingItemView.addGestureRecognizer(singleTap)

嘿这看起来是正确的答案,但当我实现这两种方法时它都不起作用-self.view.addgestureRecognitor(singleTap)和self.addingItemView.addgestureRecognitor(singleTap)。对于主视图和子视图,第二种方法不起作用。并且应该与其他手势同时识别识别识别器在这里没有帮助:(我的主视图有搜索栏,我想使用手势识别器隐藏键盘。我还想使用另一个手势识别器隐藏子视图的键盘。出现警报时,禁用主视图的手势,并在关闭警报后重新启用。AGRHH…将继续战斗。无法理解这些识别器和选择器发生了什么s、 我对UITableView、tableView有同样的问题。delaysContentTouches=false解决了这个问题