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

TableView单元格单选Checkbox及其他单元格按钮禁用逻辑实现求助

实现TableView单元格单选Checkbox及按钮禁用逻辑

核心思路

通过数据源变量统一管理选中状态,避免TableView复用导致的状态混乱,刷新列表同步所有单元格的Checkbox选中状态和按钮禁用状态。

具体实现步骤

1. 自定义单元格绑定点击回调

在自定义TableViewCell中,给Checkbox添加点击事件,通过闭包通知控制器当前选中的计划ID:

class PlanTableViewCell: UITableViewCell {
    @IBOutlet weak var planCheckbox: UIButton! // 可用Button模拟Checkbox,或用UISwitch/第三方控件
    @IBOutlet weak var actionButton: UIButton!
    
    var onCheckboxTap: ((Int) -> Void)?
    var planId: Int = 0
    
    @IBAction func checkboxTapped(_ sender: UIButton) {
        onCheckboxTap?(planId)
    }
}

2. 控制器中处理选中与状态同步

在cellForRowAt方法里配置单元格状态,并处理Checkbox点击后的逻辑:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "PlanCell", for: indexPath) as! PlanTableViewCell
    let plan = plansModel[indexPath.row]
    
    // 配置Checkbox选中状态:对比当前计划ID与selectedPlanId
    cell.planCheckbox.isSelected = (plan.id == selectedPlanId)
    
    // 配置按钮禁用状态:有选中项且当前单元格非选中项时,禁用按钮
    let hasSelected = !isAllUnselected
    cell.actionButton.isEnabled = !hasSelected || (plan.id == selectedPlanId)
    
    // 绑定计划ID与点击回调
    cell.planId = plan.id
    cell.onCheckboxTap = { [weak self] tappedPlanId in
        guard let self = self else { return }
        
        // 处理选中逻辑:点击已选中项时可选择取消(按需调整)
        if tappedPlanId == self.selectedPlanId {
            // 取消选中
            self.selectedPlanId = -1 // 用无效ID标记未选中状态
            self.isAllUnselected = true
        } else {
            // 切换选中当前项
            self.selectedPlanId = tappedPlanId
            self.isAllUnselected = false
        }
        
        // 刷新所有单元格同步状态
        self.priceTableView.reloadData()
        // 更新顶部按钮显示状态
        self.changePlanBtn.isHidden = self.isAllUnselected
    }
    
    return cell
}

3. 配合现有初始化逻辑

你的setupData函数已经完成了数据源与初始选中状态的同步,只要确保cellForRowAt中的配置逻辑正确,初始化时就能正常显示状态。

关键注意事项

  • 禁止直接操作单元格控件:TableView存在复用机制,必须通过selectedPlanId、isAllUnselected这类数据源变量判断状态,不能直接遍历修改其他单元格,否则会出现复用异常。
  • 弱引用避免循环引用:单元格闭包中使用[weak self],防止控制器无法释放。
  • 灵活调整取消逻辑:如果需求是「必须保持一个选中项」,可删除点击已选中项取消的代码,仅保留切换选中其他项的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:31:35