iOS开发:如何正确拼接计数变量与字符串实现汇总显示?
问题分析与解决方案
你的问题核心在于每次点击按钮都往共享数组里追加了新的字符串记录,而不是更新对应物品的现有计数,导致汇总时显示了每一次操作的结果,而非最终状态。我们可以通过改用字典存储计数来解决这个问题,具体步骤如下:
1. 修改共享数据的存储类型
首先在你的CustomTabBarController中,把原来的sharedInfo: [String]改成字典类型,用来映射物品名称和它的最终计数:
class CustomTabBarController: UITabBarController { // 替换原来的[String]类型为[String: Int] var sharedInfo: [String: Int] = [:] // ... 其他原有代码 }
2. 更新加号按钮的逻辑
在MainViewController的didTapPluss方法中,不再追加新字符串,而是直接更新字典中对应物品的计数:
extension MainViewController: CountDelegate { func didTapPluss(cell: MenuCell) { let indexPath = menuTableView.indexPath(for: cell)! let currentItem = items[indexPath.row] currentItem.counter += 1 cell.counterLabel.text = "\(currentItem.counter)" if let tbc = self.tabBarController as? CustomTabBarController { let itemName = staticList[indexPath.row].name // 直接更新字典中的计数,和当前单元格的计数保持同步 tbc.sharedInfo[itemName] = currentItem.counter } } }
3. 处理减号按钮(补充)
如果你的减号按钮也需要同步更新汇总数据,参考下面的逻辑(确保计数不会小于0,且计数为0时可以移除对应条目,避免显示无效的0计数):
func didTapMinus(cell: MenuCell) { let indexPath = menuTableView.indexPath(for: cell)! let currentItem = items[indexPath.row] // 防止计数变成负数 currentItem.counter = max(0, currentItem.counter - 1) cell.counterLabel.text = "\(currentItem.counter)" if let tbc = self.tabBarController as? CustomTabBarController { let itemName = staticList[indexPath.row].name if currentItem.counter == 0 { // 计数为0时移除条目,避免显示"0 Banana"这类内容 tbc.sharedInfo.removeValue(forKey: itemName) } else { tbc.sharedInfo[itemName] = currentItem.counter } } }
4. 重构汇总页面的字符串拼接
在汇总页面的viewDidAppear方法中,将字典转换为你需要的格式:
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) if let tbc = self.tabBarController as? CustomTabBarController { // 将字典的键值对转换为"计数 名称"的字符串数组 let summaryEntries = tbc.sharedInfo.map { "\($0.value) \($0.key)" } // 用空格拼接成一行(如果需要每行一个条目,把分隔符改成"\n"即可) sumaryLabel.text = summaryEntries.joined(separator: " ") } }
这样修改后,无论你点击多少次加减按钮,汇总标签都会显示每个物品的最终计数,比如点击Banana+两次、Tomatoe+一次,就会正确显示2 Banana 1 Tomatoe。
内容的提问来源于stack exchange,提问作者PerNil
相关产品推荐
相关产品推荐

