Swift/iOS删除UITableView行后UserDefaults数组未更新问题求助
核心问题原因
- 存取UserDefaults的Key不统一:读取购物车数据用的key是
cartt,通过PropertyListDecoder解析Data类型的存储值;但删除操作后存储用的key是myArrayKey,且直接存储自定义结构体数组,自定义结构体无法直接存入UserDefaults,是失效的核心原因。 - viewDidLoad逻辑冲突:先调用
getCartData()加载cartt下的购物车数据,紧接着又尝试读取myArrayKey下的数组覆盖cartArray,逻辑冗余且冲突。 - 购物车数量加减操作时没有同步更新UserDefaults,重启App后修改会丢失。
- 旧版本删除方法中多余调用
tableView.reloadData(),和deleteRows的删除动画冲突。
具体修改方案
1. 封装统一的购物车存储方法
新增方法统一处理购物车数据的编码和存储,避免重复代码:
// 统一存储购物车数据到UserDefaults func saveCartToUserDefaults() { let defaults = UserDefaults.standard do { let data = try PropertyListEncoder().encode(cartArray) defaults.set(data, forKey: "cartt") defaults.synchronize() } catch { print("购物车存储失败: \(error)") } }
2. 修正viewDidLoad冗余逻辑
删除多余的myArrayKey读取逻辑,只用统一的读取方法:
override func viewDidLoad() { super.viewDidLoad() self.getCartData() }
3. 修改删除逻辑,调用统一存储方法
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { cartArray.remove(at: indexPath.row) tableView.deleteRows(at: [indexPath], with: .automatic) saveCartToUserDefaults() // 可补充调用更新底部总价、总数量的方法 updateTotalInfo() } }
4. 修正数量加减逻辑,同步存储到UserDefaults
同时优化刷新逻辑,只刷新改动的行,提升性能:
@objc func add(sender: UIButton){ if cartArray[sender.tag].cartQuantity >= 0 { cartArray[sender.tag].cartQuantity += 1 tableView.reloadRows(at: [IndexPath(row: sender.tag, section: 0)], with: .none) saveCartToUserDefaults() updateTotalInfo() } } @objc func sub(sender: UIButton){ if cartArray[sender.tag].cartQuantity > 0 { cartArray[sender.tag].cartQuantity -= 1 tableView.reloadRows(at: [IndexPath(row: sender.tag, section: 0)], with: .none) saveCartToUserDefaults() updateTotalInfo() } }
5. 可选:新增底部信息更新方法
同步更新页面上的总数量、总价等展示:
// 更新底部总价、总数量等信息 func updateTotalInfo() { let totalCount = cartArray.reduce(0) { $0 + $1.cartQuantity } self.totalCount.text = "\(totalCount)" let subtotal = cartArray.reduce(0.0) { result, item in let price = Double(item.cartItems.price) ?? 0 return result + (price * Double(item.cartQuantity)) } subtotalPrice.text = String(format: "%.2f", subtotal) // 运费、最终总价可根据你的业务逻辑补充计算 }
内容的提问来源于stack exchange,提问作者Ahana Chakraborty
相关产品推荐
相关产品推荐

