如何在同一视图中收听不同控件上的点击手势?
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 个不同的视图,并为每个视图附加不同的手势识别器。如果ratingControl1
和ratingControl2
是视图对象,也许您打算将手势识别器直接附加到它们,而不是self.view
?
【讨论】:
感谢您的澄清。真的很感激。该文档对目标和附件的作用感到困惑。您的回复澄清了。 如果我们已经解决了您的问题,那么您应该接受您认为最能解决您的问题的答案。以上是关于如何在同一视图中收听不同控件上的点击手势?的主要内容,如果未能解决你的问题,请参考以下文章