UITapGestureRecognizer 仅适用于最后一项

Posted

技术标签:

【中文标题】UITapGestureRecognizer 仅适用于最后一项【英文标题】:UITapGestureRecognizer Only Works on Last Item 【发布时间】:2016-03-10 06:27:55 【问题描述】:

我正在创建一个简历应用程序(主要是为了好玩),但似乎无法让点击手势识别器为我工作。我想要的是让一个标签显示信息,并根据他们在下面点击的标题标签进行更改。这是我写的代码:

import UIKit

class WorkHistoryViewController: UIViewController 

    // MARK: Properties

    @IBOutlet weak var jobOne: UILabel!
    @IBOutlet weak var jobTwo: UILabel!
    @IBOutlet weak var jobThree: UILabel!
    @IBOutlet weak var jobFour: UILabel!
    @IBOutlet weak var jobFive: UILabel!
    @IBOutlet weak var workHistoryDescriptionLabel: UILabel!
    let tapRec = UITapGestureRecognizer()

    override func viewDidLoad() 
        super.viewDidLoad()
        tapRec.addTarget(self, action: "tappedLabel")
        jobOne.addGestureRecognizer(tapRec)
        jobTwo.addGestureRecognizer(tapRec)
        jobThree.addGestureRecognizer(tapRec)
        jobFour.addGestureRecognizer(tapRec)
        jobFive.addGestureRecognizer(tapRec)
    

    // MARK: Methods

    func tappedLabel() 
        workHistoryDescriptionLabel.text = "It worked!"
    

发生的情况是,在 viewDidLoad() 中调用 addGestureRecognizer() 的最后一个标签是唯一有效的标签。如果我注释掉最后一行,那么只有它上面的标签有效。我还尝试以编程方式在每个标签和属性检查器上启用用户交互,但都没有改变任何东西。

【问题讨论】:

你必须为每个标签添加不同的手势 你只分配一次,它应该如何在每个标签上工作? 【参考方案1】:

根据 Apple 的事件处理指南

手势识别器附加到视图

每个手势识别器都是 与一个视图相关联。相比之下,一个视图可以有多个 手势识别器,因为单个视图可能会响应多个 不同的手势。让手势识别器识别触摸 发生在特定视图中,您必须将手势识别器附加到 那个观点。当用户触摸该视图时,手势识别器 在视图对象之前接收到触摸发生的消息。 因此,手势识别器可以代表触摸响应 视图。

因此,您需要创建多个UITapGestureRecognizer 实例并将它们附加到每个视图,即使它们执行相同的操作。

例如,

let tapRecOne = UITapGestureRecognizer()
tapRecOne.addTarget(self, action: "tappedLabel")
jobOne.addGestureRecognizer(tapRecOne)

let tapRecTwo = UITapGestureRecognizer()
tapRecTwo.addTarget(self, action: "tappedLabel")
jobTwo.addGestureRecognizer(tapRecTwo)

等等。

【讨论】:

【参考方案2】:

您需要创建新的点击手势对象才能完成您的工作。您可以参考showing images in UIScrollview horizontally on ipad and getting tag of image on tap

【讨论】:

【参考方案3】:

这里是定义为here 的 Apple 文档。

手势识别器在对特定视图和该视图的所有子视图进行命中测试的触摸上进行操作。因此,它必须与该视图相关联。要建立这种关联,您必须调用 UIView 方法 addGestureRecognizer:。手势识别器不参与视图的响应者链。

这意味着您需要为每个视图拥有单独的“UIGestureRecognizer”实例。这应该可以解决问题。

【讨论】:

【参考方案4】:

Xcode 在 Xcode 中有一个您在此屏幕截图中看到的小图标,您可以在应用运行时单击该图标。正如我在此屏幕截图中所说,它在尝试了解 UI 问题发生的情况时非常宝贵?

【讨论】:

以上是关于UITapGestureRecognizer 仅适用于最后一项的主要内容,如果未能解决你的问题,请参考以下文章

使用 UITapGestureRecognizer 无法识别的选择器

UIlabel 中的 UITapGestureRecognizer 错误

UITapGestureRecognizer 的问题

带有点击事件的 UITapGestureRecognizer

UIButton 上的 UITapGestureRecognizer

为啥 UIButton 会覆盖 UITapGestureRecognizer?