Swift - 多个 UILabel 点击事件到相同的功能

Posted

技术标签:

【中文标题】Swift - 多个 UILabel 点击事件到相同的功能【英文标题】:Swift - Multiple UILabel click events to same function 【发布时间】:2018-04-25 11:57:53 【问题描述】:

我需要在多个UILabel中添加一个UITapGestureRecognizer,它们都需要去同一个函数进行处理。

我拥有的是这样的:

@IBOutlet weak var label_something: UILabel!
let tap = UITapGestureRecognizer(target: self, action: #selector(self.myFunction))
label_something.addGestureRecognizer(tap)

在这里收到:

@objc func myFunction(sender:UITapGestureRecognizer)  // Something... 

像魅力一样工作。问题是它只适用于一个 UILabel(如果将 addGestureRecognizer(tap) 添加到多个 UIlabel 它只适用于添加的最后一个)

所以我的问题是:

如何在这里实现我想要做的?五个不同的 UILabel 和 tapRecognizer 去同一个函数

【问题讨论】:

你是如何确定myFunction(sender:) 只为一个标签调用的?如果您点击另一个标签,它没有调用。你检查过日志吗? 是的,函数中的简单 print("hepp") 仅在单击有效的那个时才会显示。 您能在这里看到更多代码吗?即你如何分配label_something 你为什么使用标签而不是按钮? @Sourcey86 你在哪里为所有其他标签添加了手势? 【参考方案1】:

UIGestureRecognizer 与单个视图一起使用,您必须创建UIGestureRecognizer 的新实例

func setGesture() -> UITapGestureRecognizer 

     var myRecognizer = UITapGestureRecognizer()

     myRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.myFunction))
     return myRecognizer


label_something1.addGestureRecognizer(setGesture())    
label_something2.addGestureRecognizer(setGesture())

【讨论】:

【参考方案2】:

如果您从 UITapGestureRecognizer 添加新实例,它将正常工作,例如

let tap = UITapGestureRecognizer(target: self, action: #selector(self.myFunction))
label_1.addGestureRecognizer(tap)
let tap2 = UITapGestureRecognizer(target: self, action: #selector(self.myFunction))
label_2.addGestureRecognizer(tap)

【讨论】:

您确定需要为每个标签创建新手势吗? @Mani 手势识别器只能附加到一个视图。原因是每个识别器都可以有自己的手势状态(一个被触发,另一个未被触动)。 我认为是的,因为如果你使用相同的实例,它将被添加到最后一个标签。 @Crazyrems 你明白了。看到这个之后。 ***.com/questions/4747238/… @Mani 是的。每个标签都需要一个点击手势识别器,即一个UITapGestureRecognizer只能分配给单个组件,这就是为什么last标签识别tap,它会自动从以前的标签中删除。但是,所有手势都可以有相同的选择器方法。【参考方案3】:

每个 UIView 都需要自己的识别器,对于这种情况,我有一个小助手功能。随意复制/粘贴。

private func addTapRecognizer(toView view: UIView) 
        let recognizer = UITapGestureRecognizer(target: self, action: #selector(didTapButton(sender:)))
        view.isUserInteractionEnabled = true
        view.addGestureRecognizer(recognizer)
    

    @objc private func didTapButton(sender: UIGestureRecognizer) 
        guard let view = sender.view else 
            return
        

        switch view 
        case self.imageView: // any view you want to check
        default:
            print(sender.debugDescription)
        
     

【讨论】:

以上是关于Swift - 多个 UILabel 点击事件到相同的功能的主要内容,如果未能解决你的问题,请参考以下文章

从 UITableViewCell 中点击 Swift 更改标签文本颜色

如何仅为Swift 3中的UILabel的特定范围设置点击手势

swift button的点击方法有多个参数 这种点击事件应该怎么写

当 UIStepper 在 Swift 4 中以编程方式点击时如何更改 UILabel 的文本,如果它们都在 UITableViewCell 中?

当基本字符串包含双引号时,仅针对 Swift 中 UILabel 的特定范围的点击手势不起作用

使用不可见的 UILabel 并触发 UITextView 事件或不使用 UILabel 并处理 UITextView 点击识别器