【问题标题】:Swift 3 UITapGestureRecognizer not receiving tapSwift 3 UITapGestureRecognizer 没有收到点击
【发布时间】:2017-05-03 17:32:12
【问题描述】:

我想在我的一个视图中添加一个手势识别器来检测点击, 这是我的代码:

class DateTimeContainer: UIView, UIGestureRecognizerDelegate {
    override func awakeFromNib() {
        let gesture = UITapGestureRecognizer(target: self, action: #selector(self.onTap))
        gesture.delegate = self
        self.addGestureRecognizer(gesture)
    }

    func onTap(_ gestureRecognizer: UITapGestureRecognizer) {
        openDatePicker()
    }

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        if touch.view?.tag != self.datePickerTag && !self.isDatePickerOpen() {
            return true
        }
        return false
    }
}

当我点击我的视图时,代码进入gestureRecognizer shouldReceive 方法并进入返回true 的条件。

但是onTap 方法从来没有被调用过,谁能告诉我为什么?

编辑

添加self.isUserInteractionEnabled = true 我设法让它工作。 但它有一个奇怪的行为:就像它只在主视图中而不是在子视图中接收到点击。 因此,为了简单起见,我通过在视图中添加一个按钮并使用以下方法解决了问题:

self.button?.addTarget(self, action: #selector(onTap), for: .touchUpInside)

【问题讨论】:

  • 你在点击什么来调用你的onTap方法?
  • 全视图
  • 您在选择器中缺少参数部分。

标签: ios swift uigesturerecognizer


【解决方案1】:

您可能忘记了这样做:

self.isUserInteractionEnabled = true

此外,通常 UIViewController 子类通常是目标并包含用于点击手势的方法。

您不需要为点击手势设置委托(通常)

【讨论】:

  • 我需要委托来区分何时处理点击以执行操作
【解决方案2】:

我注意到您在 UIView 上添加手势。因此,在您添加此 ContainerView 的 ViewController 处,在 viewDidLoad 方法中,添加这行代码。

override func viewDidLoad() {
    super.viewDidLoad()
    self.YourContainerView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(YourCurrentViewController.openDatePicker())))
    self.YourContainerView.isUserInteractionEnabled = true
}

注意。不要忘记将isUserInteractionEnabled 添加为true。

【讨论】:

    【解决方案3】:

    你可以做手势

    let recognizer = UITapGestureRecognizer(target: self,action:#selector(self.handleTap(recognizer:)))
    userImage.isUserInteractionEnabled = true
        recognizer.delegate = self as? UIGestureRecognizerDelegate
    userImage.addGestureRecognizer(recognizer)
    

    和方法调用选择器

    func handleTap(recognizer:UITapGestureRecognizer) {
    
               // do your coding here on method 
    
    
    
            }
    

    【讨论】:

      【解决方案4】:

      尝试编写代码

      let gesture = UITapGestureRecognizer(target: self, action: #selector(self.onTap))
              gesture.delegate = self
              self.addGestureRecognizer(gesture)
      

      init 内块不在awakeFromNib()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多