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

问题描述 投票:1回答:1

我试图获取我保存的数据,然后将其加载到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
}

我有一种感觉,这是一个逻辑错误,在TableView中获取/显示数据,但我不确定它到底是什么/如何解决它。谢谢您的帮助!

swift tableview codable
1个回答
1
投票

我不知道你的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
}
© www.soinside.com 2019 - 2024. All rights reserved.