Swift - 从 UserDefaults 中检索数据后,TableView 中没有显示数据

Swift - No data displayed in TableView after Retrieving it from UserDefaults

我正在尝试获取已保存的数据,然后将其加载到 TableView 中。目前,如果我是第一次保存对象,数据会被正确编码、保存、解码、读取和显示。但是,如果密钥已经存在并且我正在添加到现有数据,则 TableView 中不会显示任何内容。

这是目前我在第一个视图控制器中保存它的方式:

let userEntry = UserEntries(date: String(todayDate), questions: [UserEntries.Question(question: q1Text, answer: q1Answer), UserEntries.Question(question: q2Text, answer: q2Answer)])

    var allEntries : [UserEntries] = []
    if doesKeyExist(key: "allEntries") == true {
        let jsonDecoder = JSONDecoder()
        if let data = UserDefaults.standard.data(forKey: "allEntries"),
            let userEntries = try? jsonDecoder.decode(UserEntries.self, from: data) {
            allEntries = [userEntries]
        }

        allEntries.insert(userEntry, at: 0)

        let jsonEncoder = JSONEncoder()
        if let value = try? jsonEncoder.encode(allEntries) {
            UserDefaults.standard.set(value, forKey: "allEntries")
            UserDefaults.standard.synchronize()
        }
    } else {
        let jsonEncoder = JSONEncoder()
        if let value = try? jsonEncoder.encode(userEntry) {
            UserDefaults.standard.set(value, forKey: "allEntries")
            UserDefaults.standard.synchronize()
        }
    }

    let newViewController = storyboard?.instantiateViewController(withIdentifier: "tabViewController") as! UITabBarController
    present(newViewController, animated: true, completion: nil)
}

这就是我在 TableView 中的显示方式

var TableData : [UserEntries] = []
override func viewDidLoad() {
    super.viewDidLoad()

    let jsonDecoder = JSONDecoder()
    if let data = UserDefaults.standard.data(forKey: "allEntries"),
        let userEntries = try? jsonDecoder.decode(UserEntries.self, from: data) {
        print(userEntries.date)
        TableData = [userEntries]
    }

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem
}

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

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

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "entryCell", for: indexPath)

    cell.textLabel?.text = TableData[indexPath.row].date
    cell.detailTextLabel?.text = TableData[indexPath.row].questions[0].answer

    return cell
}

我感觉这是一个逻辑错误,在 getting/displaying TableView 的数据中,但我不确定 is/how 究竟是什么修复了它。感谢您的帮助!

我不知道你的 doesKeyExists 函数是做什么的,但你可以通过这种方式改进你的数据操作:

    let userEntry = UserEntries(date: String(todayDate), questions: [UserEntries.Question(question: q1Text, answer: q1Answer), UserEntries.Question(question: q2Text, answer: q2Answer)])

    var allEntries : [UserEntries] = []

    let jsonDecoder = JSONDecoder()
    if let data = UserDefaults.standard.data(forKey: "allEntries"),
         let userEntries = try? jsonDecoder.decode([UserEntries].self, from: data) {
        allEntries = userEntries
    }

    allEntries.insert(userEntry, at: 0)

    let jsonEncoder = JSONEncoder()
    if let value = try? jsonEncoder.encode(allEntries) {
        UserDefaults.standard.set(value, forKey: "allEntries")
        UserDefaults.standard.synchronize()
    }

    let newViewController = storyboard?.instantiateViewController(withIdentifier: "tabViewController") as! UITabBarController
    present(newViewController, animated: true, completion: nil)
}

你的控制器的问题是你只保存了一个条目到 UserDefaults。尝试将您的代码更改为

let jsonDecoder = JSONDecoder()
if let data = UserDefaults.standard.data(forKey: "allEntries"),
    let userEntries = try? jsonDecoder.decode([UserEntries].self, from: data) {
    print(userEntries)
    TableData = userEntries
}