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
相关产品推荐
相关产品推荐

