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

如何在ViewController导航栏标题实时显示TableViewCell选中项数量?

解决方案:实时更新导航栏选中数量

问题原因

  1. 每个单元格单独维护选中计数dealerCount,传递给控制器的是单个单元格的增量而非全局选中总数,逻辑错乱。
  2. 仅在页面重新显示时(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:50:27