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

如何通过代码禁用UICollectionViewCell中UIButton的addTarget事件?

UICollectionViewCell按钮点击禁用问题解决方案

优先方案:利用UIButton原生状态实现

最直接可靠的方式是直接操作按钮的isEnabled属性——UIButton本身的isEnabled设为false时,会自动拦截所有点击事件,同时按钮会呈现灰化的视觉状态,无需额外处理事件绑定:

// 禁用按钮点击时
isButtonEnabled = false
actButton.isEnabled = false

// 重新启用时
isButtonEnabled = true
actButton.isEnabled = true

你之前的方法失效,大概率是isButtonEnabled的状态没有和按钮的isEnabled同步,或是在子线程修改状态导致未及时更新。

移除Target的正确操作方式

如果一定要通过移除Target实现禁用,需注意调用时机和Cell复用逻辑:

  1. 准确移除事件:确保在按钮已添加Target之后调用移除方法,指定正确的事件类型:
// 禁用点击时
actButton.removeTarget(self, action: #selector(buttonClicked), for: .touchUpInside)

// 恢复点击时
actButton.addTarget(self, action: #selector(buttonClicked), for: .touchUpInside)
  1. 处理Cell复用:由于UICollectionViewCell会被复用,必须在prepareForReuse方法中重置按钮状态,避免复用后状态混乱:
override func prepareForReuse() {
    super.prepareForReuse()
    // 根据当前isButtonEnabled状态重置按钮事件
    if isButtonEnabled {
        actButton.addTarget(self, action: #selector(buttonClicked), for: .touchUpInside)
    } else {
        actButton.removeTarget(self, action: #selector(buttonClicked), for: .touchUpInside)
    }
    // 同步按钮isEnabled状态,保证视觉反馈
    actButton.isEnabled = isButtonEnabled
}

你之前在init里移除无效,是因为init阶段按钮可能还未完成初始化,或是后续在awakeFromNib、Cell配置方法中又重新添加了Target。

修正原有判断逻辑

如果坚持在buttonClicked内做判断,需确保isButtonEnabled状态同步正确:

@objc func buttonClicked() {
    // 确保在主线程判断,避免多线程状态不一致
    DispatchQueue.main.async { [weak self] in
        guard let self = self, self.isButtonEnabled else { return }
        // 执行原有点击逻辑
    }
}

检查isButtonEnabled的赋值是否在主线程完成——UI相关状态修改必须在主线程执行,否则会出现状态不同步的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:56:13