如何在ViewController导航栏标题实时显示TableViewCell选中项数量?
解决方案:实时更新导航栏选中数量
问题原因
- 每个单元格单独维护选中计数
dealerCount,传递给控制器的是单个单元格的增量而非全局选中总数,逻辑错乱。 - 仅在页面重新显示时(
viewWillAppear)更新标题,按钮点击时没有实时触发标题刷新,且硬传0会重置计数。
修复步骤
1. 重构单元格的代理逻辑
修改DealerCardTableViewCell,去掉单个单元格的计数,点击按钮时直接通知控制器当前操作的变化量(选中加1,取消减1):
class DealerCardTableViewCell: UITableViewCell { @IBOutlet weak var selectDealerButton: UIButton! weak var delegate: DealerListDelegate? var account: Account? // 替换为你实际的账户类型 @objc func selectDealer() { guard let account = account else { return } selectDealerButton.isSelected = !selectDealerButton.isSelected // 通知控制器当前的变化值 let change = selectDealerButton.isSelected ? 1 : -1 delegate?.didUpdateSelectedCount(change: change) } } // 定义代理协议 protocol DealerListDelegate: AnyObject { func didUpdateSelectedCount(change: Int) }
2. 控制器维护全局计数并实时更新标题
在DealerListViewController中维护全局选中总数,收到单元格的变化通知后立刻更新标题,同时处理页面显示时的初始化:
class DealerListViewController: DealerCardTableViewController, DealerListDelegate { // 全局保存选中的总数量 private var totalSelectedCount = 0 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 页面显示时,从已选数组初始化总数 totalSelectedCount = selectedAccounts.count updateNavigationTitle() } // 接收单元格的变化通知,更新总数并刷新标题 func didUpdateSelectedCount(change: Int) { totalSelectedCount += change updateNavigationTitle() } // 封装标题更新方法,避免重复代码 private func updateNavigationTitle() { navigationItem.title = "Selected Dealers - \(totalSelectedCount)" } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let cell = super.tableView(tableView, cellForRowAt: indexPath) as? DealerCardTableViewCell, accounts.count > 0 else { return UITableViewCell() } cell.account = accounts[indexPath.row] // 初始化按钮选中状态,解决cell复用导致的状态混乱 cell.selectDealerButton.isSelected = selectedAccounts.contains(cell.account!) cell.delegate = self return cell } }
补充提醒
- 记得同步更新
selectedAccounts数组:在单元格选中时将对应账户加入数组,取消选中时移除,这样页面重新显示时的初始化计数才会准确。 - 处理cell复用问题:必须在
cellForRowAt中根据已选数组设置按钮的选中状态,避免滚动时选中状态错乱。
内容的提问来源于stack exchange,提问作者titanPlanet12
相关产品推荐
相关产品推荐

