使用 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.location
是UILabel
对象。我在这里要做的是检测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 的点击事件的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 中使用 UITapGestureRecognizer 中的参数
使用 UITapGestureRecognizer 时不会调用 textFieldShouldEndEditing