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

