将点击手势添加到插座集合

Posted

技术标签:

【中文标题】将点击手势添加到插座集合【英文标题】:Adding tap gesture to outlet collection 【发布时间】:2018-08-12 23:08:35 【问题描述】:

UITapGestureRecognizer 添加到我的UILabel。我为 UILabels 创建了一个 outlet collection,我想将点击事件添加到其中。这是我的代码:

Outlet Collection Name = viewLabels

let removeLabelTapGesture = UITapGestureRecognizer(target: self, action: #selector(removeTagLabel(_:))) 

for label in (0..<viewLabels.count) 
   viewLabels[label].addGestureRecognizer(removeLabelTapGesture)


@objc func removeTagLabel(_ sender: UITapGestureRecognizer) 
    print ("inside removeTagLabel")

我正在遍历我的插座集合并将gesture recognizer 添加到每个UILabel。控制台中没有打印任何内容。

几个小时后,我想尝试将gesture recognizer单独添加到每个UILabel

viewLabels[0].addGestureRecognizer(removeLabelTapGesture)

现在这适用于UILabels 之一。按照这种方法,如果我单独执行,它会将gesture event 添加到我添加事件的最后一个UILabel

viewLabels[0].addGestureRecognizer(removeLabelTapGesture)
.
.
.
viewLabels[x].addGestureRecognizer(removeLabelTapGesture)  //Will add gesture event to this UILabel

有没有办法将gesture recognizer 添加到我的每个UILabels 中?

【问题讨论】:

【参考方案1】:

你的方法都不起作用。问题是您的代码试图将相同的点击手势识别器添加到所有标签。你不能那样做,就像你自己不能同时在纽约和伦敦一样。

【讨论】:

如果我有 3 个 UILabels 我必须创建 3 个不同的 UITapGestureRecognizer 事件然后单独添加它们?即使每个点击事件都相同? 点击手势识别器不是一个事件,它是一个响应事件的对象。是的,您想要响应点击手势的每个视图都需要自己的点击手势识别器。 可以创建一个点击手势识别器,将其附加到所有视图的超级视图,然后编写自定义代码,使用点击的坐标来计算哪个子视图被点击(如果有的话),但这是很多工作,你必须处理边缘情况,比如点击超级视图,而不是你想要响应点击的任何视图。只需为每个视图使用单独的点击手势识别器即可。 是的,工作量很大,哈哈@DuncanC。每个视图都需要自己独特的点击手势识别器。不知道 - 谢谢!【参考方案2】:

一个手势应该只与一个视图相关联

for label in viewLabels 
    let removeLabelTapGesture = UITapGestureRecognizer(target: self, action: #selector(removeTagLabel(_:))) 
    label.addGestureRecognizer(removeLabelTapGesture)

例如创建一个 UIImageView ,并多次添加到 self.view 中,你只会得到一次,因为它是一个对象

【讨论】:

以上是关于将点击手势添加到插座集合的主要内容,如果未能解决你的问题,请参考以下文章

我们可以将点击手势添加到 UILabel 吗?

如何为集合视图单元格内的视图添加手势?

无法链接到 XCode9 中的插座集合

集合视图中的点击手势无法执行

以编程方式将 UITapGestureRecognizer 添加到 Outlet 集合中的 UIViews

Xamarin.Forms 第23局:手势识别