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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:17:38