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
相关产品推荐
相关产品推荐

