You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS 9中UITableViewCell内UIButton无法点击,iOS 11正常求助

解决iOS 9中UITableViewCell内按钮点击触发Cell选中的问题

这个问题其实是iOS 9及更早版本里手势识别器与视图交互优先级的兼容性坑导致的,我来帮你拆解原因和解决办法:

问题根源

你现在的实现是给UIButton添加了自定义的UITapGestureRecognizer,但在iOS 9中,UITableViewCell默认的选中手势(对应didSelectRowAt方法)响应优先级会高于你给按钮添加的手势。再加上iOS 10之后Apple调整了手势识别的处理逻辑,这就导致了同一份代码在新系统正常、旧系统出问题的情况。另外还有个小误区:UIButton本身已经内置了点击事件的处理机制,完全没必要额外给它加Tap手势,这反而会在旧系统里引发交互冲突。

最优解决方案:改用UIButton自带的点击事件

直接给按钮绑定addTarget方法,这是最符合UIButton设计初衷的实现方式,也能彻底避免手势优先级的问题:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    // ... 你的cell初始化和配置代码
    let expansionCell = tableView.dequeueReusableCell(withIdentifier: "YourCellID", for: indexPath) as! YourCustomCellClass
    
    // 启用按钮交互
    expansionCell.playWokout.isUserInteractionEnabled = true
    // 绑定点击事件,替换原来的手势识别器
    expansionCell.playWokout.addTarget(self, action: #selector(playWokout(sender:)), for: .touchUpInside)
    
    // 如果需要传递自定义数据(比如你之前的title),可以用这几种方式:
    // 1. 给按钮设置tag,通过tag关联数据
    expansionCell.playWokout.tag = indexPath.row
    // 2. 自定义UIButton子类,添加title属性
    // 3. 通过按钮的superview找到对应的cell,再从cell获取数据
    
    return expansionCell
}

@objc func playWokout(sender: UIButton) {
    // 示例:通过按钮找到对应的cell,获取需要的数据
    guard let cell = sender.superview?.superview as? YourCustomCellClass else { return }
    let targetTitle = subGroupeCourant.nameDefault!
    // 执行你的业务逻辑
    print("点击了按钮,标题:\(targetTitle)")
}

如果你坚持要用手势识别器(不推荐)

如果因为某些原因必须保留自定义手势,那需要调整手势的属性来降低它对视图触摸事件的干扰:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    // ... 其他代码
    let tapGestureDum = MyTapGesture(target: self, action: #selector(self.playWokout(button:)))
    tapGestureDum.title = subGroupeCourant.nameDefault!
    // 关键设置:不让手势取消视图本身的触摸事件
    tapGestureDum.cancelsTouchesInView = false
    
    expansionCell.contentView.isUserInteractionEnabled = true
    expansionCell.playWokout.isUserInteractionEnabled = true
    expansionCell.playWokout.addGestureRecognizer(tapGestureDum)
    
    // 额外:关闭cell的选中样式,避免触发cell选中动画
    expansionCell.selectionStyle = .none
    
    return expansionCell
}

额外检查项

  • 确保你的自定义cell中,playWokout按钮的层级是在contentView之上,没有被其他视图遮挡
  • 确认cell的isUserInteractionEnabled属性没有被设置为false

内容的提问来源于stack exchange,提问作者tamtoum1987

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:49:45