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

Posted

技术标签:

【中文标题】UserDefaults with Struct - TableView 不显示从 UserDefaults 保存的数据?【英文标题】:UserDefaults with Struct - TableView not displaying data saved from UserDefaults? 【发布时间】:2021-04-12 02:00:25 【问题描述】:

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

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

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
       

【问题讨论】:

您至少应该解释一下,让我们了解问题所在和情况。另外,请确保您的代码在 ` ` 中,以便将其突出显示为代码,以便我们阅读 如何从 userDefault 中检索人员数据,请添加代码 您的tableViewdataSource 设置了吗?您没有使用 UITableViewController 并且您的 tableView 数据源方法在您的 viewController 类之外 是的,我做到了。问题是我无法在表格视图单元格中显示人员数据 解码数据后调用tableView.reloadData() 【参考方案1】:

首先不要使用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 中存在潜在错误,UserDefaults 中存在data(forKey。而在UITableViewControllerdataSourcedelegate默认连接。

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)
       
   

...

【讨论】:

【参考方案2】:

看看这个,它对我有用...

var dataArray = [String]()
    
    //Save the data...
    
    dataArray.append(ChatID)
    UserDefaults.standard.setValue(dataArray, forKey: "ChatIDArray")
    
    //Retrive the data...
    if let chatdataArr = UserDefaults.standard.value(forKey: "ChatIDArray") as? [String] 
        let trueCount  = chatdataArr.filter  $0 == chatID .count
        print(trueCount)
        if trueCount == 0 
            cell.Countlblref.isHidden = true
        else 
            cell.Countlblref.isHidden = false
        
        cell.Countlblref.text = "\(trueCount)"
    

【讨论】:

以上是关于UserDefaults with Struct - TableView 不显示从 UserDefaults 保存的数据?的主要内容,如果未能解决你的问题,请参考以下文章

将 Codable 保存到 UserDefaults 并匹配 NSCoding 的外观

Swift 3.0:在 TableView 的 UserDefaults 中存储数组

C++ Boost::Interprocess Shared memory with struct

P/Invoke Struct with Pointers, C++ from C#

[Journey with golang] 3. Type system

使用 UserDefaults 保存数组