微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

UserDefaults with Struct - TableView 不显示从 UserDefaults 保存的数据?

如何解决UserDefaults with Struct - TableView 不显示从 UserDefaults 保存的数据?

我在下面的表格视图单元格上显示数据时遇到问题是代码

这是我第一次和最后一次设置的结构。

struct Person: Codable {
        var firstName: String
        var lastName: String
 }

这是我保存数据的视图控制器。

class viewController: UIViewController {
        
   var newPerson = [Person]()
        
   override func viewDidLoad() {
          
     let person = [Person(firstName: "Peterson",lastName: "Jota"),Person(firstName: "John",lastName: "Paul")]
          
       let encoder = JSONEncoder()
          if let encoded = try? encoder.encode(person) {
            UserDefaults.standard.set(encoded,forKey: "savedPerson")
          }
        }
      }

这是我尝试加载数据的地方

class SeconClass: UITableViewController { 

    var person = [Person]()

    override func viewDidLoad() {

     tableView.delegate = self
     tableView.dataSource = self

    if let savedPerson = defaults.object(forKey: "one")  as? Data {
      let decoder = JSONDecoder()
      if let loadedOne = try? decoder.decode(Person.self,from: savedPerson) {
        self.person = UserDefaults.standard.object(forKey: "savedPerson")
         }
       }
    }

 func tableView( tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
        return  person.count
      }
      
 func tableView( tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellID",for: indexPath) as! UITableViewCell
        
        cell.textLabel?.text = person[indexPath.row]
        
        return cell
      } 
}

解决方法

首先不要使用 UserDefaults 在控制器之间传递数据。这是非常糟糕的做法。

错误很明显:

  • 您正在对数组进行编码,但对单个对象进行解码。
  • 您在 UserDefaults 中使用了不匹配的不同键。

我建议对所有键使用自定义结构。这避免了不匹配,因为代码完成将帮助您

struct Key {
    static let savedPeople = "savedPeople"
}

并以大写字母开头命名类,并为数组使用一个不太容易混淆的名称 (people)

class ViewController: UIViewController {
        
   var people = [Person]()
        
   override func viewDidLoad() {
          
     people = [Person(firstName: "Peterson",lastName: "Jota"),Person(firstName: "John",lastName: "Paul")]
          
     let encoder = JSONEncoder()
     if let encoded = try? encoder.encode(people) {
         UserDefaults.standard.set(encoded,forKey: Key.savedPeople)
     }
  }
}

在第二个视图控制器 catch 中存在潜在错误,data(forKey 中有 UserDefaults。在 UITableViewController 中,dataSourcedelegate 默认连接。

class SeconClass: UITableViewController { 

    var people = [Person]()

    override func viewDidLoad() {

       // tableView.delegate = self
       // tableView.dataSource = self

       if let personData = defaults.data(forKey: Key.savedPeople) {
       do {
           self.people = try JSONDecoder().decode([Person].self,from: personData) {
       } catch {
           print(error)
       }
   }

...
,

检查这个,它对我有用...

docker-compose.yml

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。