Segue跳转间TableView数据持久化问题:如何避免重复初始化?
解决TableView数据在Segue跳转后重置的问题
这个问题我做项目时也碰到过,每次通过Segue跳转都重置数据确实挺烦的,尤其是Segue数量多的时候,挨个传数组完全不现实。这里给你几个实用的解决方案,按需选择就行:
方案1:使用单例模式(最简单直接)
核心思路是让你的Cars类在整个App中只有一个实例,所有ViewController共享这个实例的数据源,这样修改后的数据就会被保留。
修改Cars.swift:
class Cars { // 定义全局唯一的单例实例 static let shared = Cars() // 私有化初始化方法,防止外部创建新的Cars实例 private init() {} var list = [CarData(name: "Toyota Corolla"), CarData(name: "BMW 3")] }
修改ListViewController.swift:
class ListViewController: UIViewController { @IBOutlet weak var tableView: UITableView! // 直接使用单例实例,而不是创建新的Cars对象 var carsList = Cars.shared var cars = [CarData]() override func viewDidLoad() { super.viewDidLoad() cars = carsList.list // 其他初始化代码... } // 比如在添加/删除单元格的方法里,修改的是单例的list func addCar(name: String) { carsList.list.append(CarData(name: name)) cars = carsList.list tableView.reloadData() } }
这样不管你通过多少次Segue跳转到ListViewController,每次拿到的都是同一个Cars实例,之前添加/删除的修改都会被保留。
方案2:本地持久化(支持App重启后保留数据)
如果需要不仅在Segue跳转间保留数据,甚至App重启后也不丢失,可以用UserDefaults做轻量持久化,当然也可以用Core Data,但UserDefaults更适合这种简单的列表数据。
第一步:让CarData遵守Codable协议
struct CarData: Codable { var name: String }
第二步:修改Cars.swift,让它自动读写UserDefaults
class Cars { var list: [CarData] { get { // 从UserDefaults读取数据,没有的话返回初始值 guard let data = UserDefaults.standard.data(forKey: "SavedCarsList") else { return [CarData(name: "Toyota Corolla"), CarData(name: "BMW 3")] } do { return try JSONDecoder().decode([CarData].self, from: data) } catch { print("读取汽车列表失败:\(error)") return [] } } set { // 将新的列表保存到UserDefaults do { let data = try JSONEncoder().encode(newValue) UserDefaults.standard.set(data, forKey: "SavedCarsList") } catch { print("保存汽车列表失败:\(error)") } } } }
第三步:在ListViewController中使用
同样可以结合单例模式,或者直接创建Cars实例,每次获取list时都会从本地读取,修改后自动保存,完美解决数据丢失问题。
为什么原来的代码会重置数据?
你原来的代码中,每次跳转到ListViewController时,都会创建一个新的Cars实例:
var carsList = Cars()
而这个新实例的list属性默认是初始的两个车型,所以每次viewDidLoad时cars数组都会被重置成初始值,这就是问题所在。
内容的提问来源于stack exchange,提问作者Anatolii Rudenko
相关产品推荐
相关产品推荐

