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

iOS开发:点击按钮向另一ViewController的Struct追加数据并持久化

iOS 追加数据丢失问题解决方案

问题根源

每次跳转至ConfirmViewController时,你大概率创建了新的控制器实例,导致存储数据的data数组被重新初始化,之前添加的数据自然丢失。

可行解决方法

方法一:全局单例存储数据

把菜单数据抽离为全局单例,确保所有控制器实例访问同一数据源:

// 新建数据管理类
class MenuDataManager {
    static let shared = MenuDataManager()
    private init() {} // 禁止外部创建实例
    
    var menuItems: [ConfirmViewController.menu] = []
}

修改ConfirmViewController的数据引用:

// 替换原有data数组声明
var data: [menu] {
    return MenuDataManager.shared.menuItems
}

// 添加数据时操作单例数组
func addNewMenuItem(_ item: menu) {
    MenuDataManager.shared.menuItems.append(item)
    cartTable.reloadData()
    updateTotalLabel() // 自行实现更新总价的方法
}

方法二:持有控制器实例复用

在原ViewController中保留ConfirmViewController的实例,避免每次跳转新建:

// 原ViewController中添加属性
private var confirmVC: ConfirmViewController?

// 处理segue时复用实例
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard segue.identifier == "你的Segue标识" else { return }
    
    if confirmVC == nil {
        confirmVC = segue.destination as? ConfirmViewController
        // 绑定TableView代理(如果故事板没绑定)
        confirmVC?.cartTable.delegate = confirmVC
        confirmVC?.cartTable.dataSource = confirmVC
    }
    
    // 传递新数据
    if let newItem = sender as? ConfirmViewController.menu {
        confirmVC?.data.append(newItem)
        confirmVC?.cartTable.reloadData()
    }
}

方法三:完善TableView基础实现

确保ConfirmViewController的TableView代理方法正确使用数据源:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return data.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "你的Cell标识", for: indexPath)
    let menuItem = data[indexPath.row]
    // 配置cell内容,例如:
    // cell.imageView?.image = UIImage(named: menuItem.menuImages)
    // cell.detailTextLabel?.text = "\(menuItem.menuPrice)元"
    return cell
}

注意事项

  • 不要在ConfirmViewController的初始化方法或viewDidLoad中重置data数组
  • 每次添加数据后必须调用cartTable.reloadData()刷新表格
  • 若使用单例处理多线程数据操作,需添加线程锁保证安全

内容的提问来源于stack exchange,提问作者Terry Hvitserk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:01:08