TapGestures 在自定义 TableViewCell 中不起作用

Posted

技术标签:

【中文标题】TapGestures 在自定义 TableViewCell 中不起作用【英文标题】:TapGestures not working inside custom TableViewCell 【发布时间】:2021-08-05 09:46:38 【问题描述】:

我将 TapGestureRecognizer 添加到自定义 TableViewCell 的 UIImageView 中,但它没有调用它的操作。 当我点击图像时,它会触发 tableview 的 didSelectRowAt 委托方法。我没有使用任何故事板或 .xib。我已经用通过 .xib 创建的 UI 做了一千次,没有任何问题,但我不明白为什么以编程方式这不起作用。有什么想法吗?

在我的自定义 TableViewCell:

var favButton = UIImageView()

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) 
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    
    addSubview(favButton)
    configureFavButton()      


func set(stock: Stock) 
        self.stock = stock
        favButton.image = UIImage(systemName: "heart.fill")?.withTintColor(.black, renderingMode: .alwaysOriginal)
    

func configureFavButton() 

    // Creating constraints using SnapKit 
    favButton.snp.makeConstraints  make in
        make.trailing.equalToSuperview().inset(10)
        make.centerY.equalToSuperview()
        make.height.width.equalTo(30)
    
    
    favButton.isUserInteractionEnabled = true
    favButton.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(removeFromFavorites)))



@objc func removeFromFavorites() 
    guard let stock = stock else  return 
    delegate?.removeFromFavorites(stock)

在我的 ViewController 中,当在 cellForRowAt 定义我的单元格时:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "FavoriteCell") as! FavoriteCell
    cell.delegate = self
    cell.set(stock: model.favorites[indexPath.row])
    return cell

【问题讨论】:

那可能是因为目标不对。 @ElTomato 你能详细解释一下吗?我的意思是,目标应该是“自我”,因为该方法在 UITableViewCell 类中,对吧? 【参考方案1】:

您需要将 subView (favButton) 添加到单元格的 contentView 而不是视图本身

contentView.addSubview(favButton)

【讨论】:

这正是问题所在。你救了我的一天!

以上是关于TapGestures 在自定义 TableViewCell 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

无法访问我的单元格内容中的变量

在自定义中从 TextField 中关闭键盘

织梦CMS如何在自定义表单页调用arclist标签啊,怎么在自定义表单页调用无效!

在自定义回调中访问验证数据

在自定义页面中创建自定义路由

在自定义操作中启用/禁用功能