如何在同一视图中收听不同控件上的点击手势?

How do I listen to tap gestures on different controls in the same view?

我有一个控件的两个副本(称为 RatingControl)。如何编写当有人双击它们时可以在正确对象上调用的处理程序?

我有:

@IBOutlet weak var ratingControl: RatingControl!
@IBOutlet weak var ratingControl2: RatingControl!

TableViewController 内,然后是

override func viewDidLoad() {
    super.viewDidLoad()

    let tapGR = UITapGestureRecognizer(target: ratingControl, action: #selector(RatingControl.doubleTap(_:)))
    tapGR.numberOfTapsRequired = 2
    self.view.addGestureRecognizer(tapGR)

    let tapGR2 = UITapGestureRecognizer(target: ratingControl2, action: #selector(RatingControl.doubleTap(_:)))
    tapGR2.numberOfTapsRequired = 2
    self.view.addGestureRecognizer(tapGR2)

}

RatingControl.doubleTap(_) 是无害的事件处理程序。

当双击第二个评分控件时,doubleTap 方法被调用,但被调度到第一个评分控件对象上!

我曾尝试在一个 UITapGestureRecognizer 上设置两个目标,但它遇到了同样的问题。

非常感谢!

连接手势识别器有两个部分:目标,确定触发识别器时通知哪个对象,以及它附加到的视图,确定识别器从哪个视图识别手势。

您有 2 个以相同方式配置的手势识别,都附加到 self.view。因此,他们将响应 self.view 上的点击(我假设是视图控制器的内容视图。)我认为在这种情况下点击时将触发哪个手势识别器是不清楚的。

您应该有 2 个不同的视图,并为每个视图附加一个不同的手势识别器。如果 ratingControl1ratingControl2 是视图对象,也许您打算将手势识别器直接附加到它们,而不是 self.view?

您需要将手势识别器添加到两个评级控件而不是 self.view

试试这个:

let tapGR = UITapGestureRecognizer(target: self, action: #selector(RatingControl.doubleTap(_:)))
tapGR.numberOfTapsRequired = 2
ratingControl.addGestureRecognizer(tapGR) // ratingControl, not self.view
let tapGR2 = UITapGestureRecognizer(target: self, action: #selector(RatingControl.doubleTap(_:))) 
tapGR2.numberOfTapsRequired = 2
ratingControl2.addGestureRecognizer(tapGR2) // ratingControl2, not self.view