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

Posted

技术标签:

【中文标题】如何在同一视图中收听不同控件上的点击手势?【英文标题】:How do I listen to tap gestures on different controls in the same view? 【发布时间】:2017-01-30 02:12:53 【问题描述】:

我有两个控件副本(称为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 上设置两个目标,但遇到了同样的问题。

非常感谢!

【问题讨论】:

怎么样:let tapGR = UITapGestureRecognizer(target: self, action: #selector(RatingControl.doubleTap(_:))) tapGR.numberOfTapsRequired = 2 ratingControl.addGestureRecognizer(tapGR) let tapGR2 = UITapGestureRecognizer(target: self, action: #selector(RatingControl.doubleTap(_:))) tapGR2.numberOfTapsRequired = 2 ratingControl2.addGestureRecognizer(tapGR2) 叹息。非常感谢。这就像一个魅力。 @nynohu 与其在评论中发布一堆不可读的代码,不如发布一个答案? @rmaddy 好的,我知道了,作为答案发布。 如果我们已经回答了您的问题,您应该接受其中一个答案。选择您认为最好的答案,或者在答案质量相同的情况下第一个回答您的问题。 【参考方案1】:

您需要将手势识别器添加到两个评分控件而不是 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

【讨论】:

是的,我说过。我认为最好解释要更改的内容和原因,而不是简单地提供插入式代码更改而不做任何解释。【参考方案2】:

连接手势识别器有 2 个部分:目标(确定触发识别器时通知哪个对象的目标)和它所附加到的视图(确定识别器从哪个视图识别手势)。

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

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

【讨论】:

感谢您的澄清。真的很感激。该文档对目标和附件的作用感到困惑。您的回复澄清了。 如果我们已经解决了您的问题,那么您应该接受您认为最能解决您的问题的答案。

以上是关于如何在同一视图中收听不同控件上的点击手势?的主要内容,如果未能解决你的问题,请参考以下文章

如何比较 iOS 上的手势类型?

如何在父视图中禁用点击手势?

如何在隐藏控件时仅捕获 MPMoviePlayerController 视图上的单击/点击?

如何将手势识别器从一个视图传递到另一个视图

C#中多个不同控件之间如何设置Tab顺序?

SWIFT4:如何让两个点击手势识别器一起工作