AddGestureRecognizer在tableViewCell中不适用于UILabel

时间:2018-08-13 07:34:44

标签: swift

我正在尝试在UILabel单元格内的tableView中添加点击事件,如下所示。

let tap = UITapGestureRecognizer(target: self, action: #selector(downloadFile(_:)))
let msgLabel = cell.viewWithTag(1000) as! UILabel
msgLabel.isUserInteractionEnabled = true
msgLabel.addGestureRecognizer(tap)

这是我的downloadFile函数。

@objc func downloadFile(_ sender:Any){
    print("tapped")
}

谁能为我解决这个问题。

4 个答案:

答案 0 :(得分:0)

tap.delegate =self;
tap.numberOfTapsRequired = 1;

将以上代码添加到UITapGestureRecognizer对象中。这样就可以了:

let tap = UITapGestureRecognizer(target: self, action: #selector(downloadFile(_:)))
tap.delegate =self;
tap.numberOfTapsRequired = 1;
let msgLabel = cell.viewWithTag(1000) as! UILabel
msgLabel.isUserInteractionEnabled = true
msgLabel.addGestureRecognizer(tap)

答案 1 :(得分:0)

我通过子类化UITableViewCell提出了一个替代方案。然后,在自定义TableView单元格内创建downloadFile方法。

请不要忘记在tapGesture目标中用self替换cell

let tap = UITapGestureRecognizer(target: cell, action: #selector(cell.downloadFile(_:)))

我将进一步解释...

第一步:创建自定义单元格

import UIKit

class TableViewCell: UITableViewCell {

    @objc func downloadFile() {
        print("download")
    }

    override func awakeFromNib() {
        super.awakeFromNib()

    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }
}

第二步:在tableView数据源(cellForRowAt)中键入UITableViewCell

 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! CustomTableViewCell

 let tap = UITapGestureRecognizer(target: cell, action: #selector(cell.downloadFile(_:)))

答案 2 :(得分:0)

在UITableViewCell子类中创建手势识别器。

class CustomTableViewCell: UITableViewCell{

var exampleLabel: UILabel!

override func awakeFromNib() {
    super.awakeFromNib()
}

func initViews(){

    let gesture = UITapGestureRecognizer.init(target: self, action: #selector(labelTapped))
    exampleLabel.addGestureRecognizer(gesture)
    print(exampleLabel.frame)
}

@objc func labelTapped(){
    print("Do something here")
}
}

上面的代码将要求您从情节提要中在UITableView中注册一个CustomTableViewCell类型的单元格。如果您不使用情节提要,请相应地更改代码,并可能将initView方法添加到didMoveToWindow覆盖中。

在您的控制器类中,协议替代应遵循以下类型:

extension HomeController: UITableViewDelegate,UITableViewDataSource{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 30
    }

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "SomeIdentifierString", for: indexPath) as! CustomTableViewCell
    return cell
}
}

对实际问题不重要,但我想补充一点,如果您不使用情节提要,请添加以下行来注册UITableViewCell子类:

let exampleTable = UITableView.init(frame: self.view.frame, style: .plain)
self.view.addSubview(exampleTable)
exampleTable.register(CustomTableViewCell.self, forCellReuseIdentifier: "SomeIdentifierString")

答案 3 :(得分:0)

使用惰性变量

lazy var label: UILabel = {
   let label = UILabel()
   label.isUserInteractionEnabled = true
   label.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(downloadFile)))
   return label
}()