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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:48:03