使用 UITapGestureRecognizer 检测 UITableViewCell 中 UILabel 的点击事件

Posted

技术标签:

【中文标题】使用 UITapGestureRecognizer 检测 UITableViewCell 中 UILabel 的点击事件【英文标题】:Detecting Tap Events for UILabel inside UITableViewCell using UITapGestureRecognizer 【发布时间】:2017-03-17 20:44:41 【问题描述】:

我有一个UITableViewDataSource,下面是

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: OutletDetails.cellIdentifier) as! OutletDetails
    cell.selectionStyle = .none
    cell.isUserInteractionEnabled = true
    cell.location = "Some location will be here"
    let tap = UITapGestureRecognizer(target: self, action: #selector(locationClicked))
    tap.cancelsTouchesInView = false
    tap.numberOfTapsRequired = 1
    cell.location.addGestureRecognizer(tap)

其中cell.locationUILabel 对象。我在这里要做的是检测UILabel 上的点击事件。我查看了整个互联网,每个人都在建议这种方法,但是,这段代码在我的情况下不起作用。 locationClicked 方法根本没有被调用。谁能告诉我我的代码有什么问题?

编辑 还有一件事,以记忆方式这样做是个好主意吗?我的意思是,如果我们有一个很长的列表,那么每个单元格都会生成许多 UIGestureRecognizer 对象。这是因为在滚动项目时会经常调用该方法。

【问题讨论】:

我的回答好运吗?有意义吗? @toddg 不幸的是它对我不起作用,我最终将标签更改为按钮并将其格式化,使其看起来像标签 哦,我明白了。您应该发布您的解决方案并接受它,以便其他人可以从中受益。 【参考方案1】:

由于您要使单元格出列,因此您需要以某种方式获取对 UITapGestureRecognizer 的引用,然后将其删除或重新使用。否则,每次重用一个单元格时,您都会将另一个识别器放在已经在该单元格上的识别器上。如果您要将 UITableViewCell 子类化,您只需将识别器添加为属性即可。

但是,使用您发布的代码,我建议您使用UIButton 并添加一个标签,以便您以后可以参考它。您可以将按钮的边界设置为等于标签的边界。试试这样的:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: OutletDetails.cellIdentifier) as! OutletDetails
    cell.selectionStyle = .none
    cell.isUserInteractionEnabled = true
    cell.location = "Some location will be here"

    // If we don't already have a button on our cell, create one and set the tag
    if cell.viewWithTag(103) as? UIButton == nil 
        let newButton = UIButton(frame: cell.location.bounds)
        newButton.tag = 103
        newButton.addTarget(target: self, action: #selector(locationClicked), for: .touchUpInside)
    

【讨论】:

【参考方案2】:

向对象添加轻击手势并启用其用户交互。是的,您也可以按按钮。

//Adding tap gesture
let cellNameTapped = UITapGestureRecognizer(target: self, action:     #selector(nameTapped))
nameLabel.isUserInteractionEnabled = true// UILabel made available for touch interaction 
nameLabel.addGestureRecognizer(cellNameTapped) //gesture added

//Method called on touch of nameLabel
@objc func nameTapped(tapGestureRecognizer: UITapGestureRecognizer)
//print(tapGestureRecognizer.view)

【讨论】:

以上是关于使用 UITapGestureRecognizer 检测 UITableViewCell 中 UILabel 的点击事件的主要内容,如果未能解决你的问题,请参考以下文章

使用UITapGestureRecognizer传递参数

在 Swift 中使用 UITapGestureRecognizer 中的参数

使用 UITapGestureRecognizer

使用 UITapGestureRecognizer 时不会调用 textFieldShouldEndEditing

UIlabel 中的 UITapGestureRecognizer 错误

使用 UITapGestureRecognizer 根据 iPhone 中的手指触摸位置添加新视图