Swift 带Struct-TableView的UserDefaults是否不显示从UserDefaults保存的数据?

Swift 带Struct-TableView的UserDefaults是否不显示从UserDefaults保存的数据?,swift,tableview,userdefaults,Swift,Tableview,Userdefaults,我在下面的“表格视图”单元格中显示数据时遇到问题。代码如下 这是我的结构,我有第一个和最后一个设置 struct Person: Codable { var firstName: String var lastName: String } 这是我保存数据的视图控制器 class viewController: UIViewController { var newPerson = [Person]() overri

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

这是我的结构,我有第一个和最后一个设置

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
      } 
}

签出这个,它为我工作

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在控制器之间传递数据。这是非常糟糕的做法

错误很明显:

您正在对数组进行编码,但对单个对象进行解码。 您在UserDefaults中使用了不匹配的不同键。 我建议对所有键使用自定义结构。这避免了不匹配,因为代码完成将帮助您

struct Key {
    static let savedPeople = "savedPeople"
}
并以大写字母开头命名类,并为数组使用不太容易混淆的名称

在第二个视图中,控制器捕捉到一个潜在的错误,并且UserDefaults中有dataforKey。在UITableViewController中,默认情况下,数据源和委托是连接的

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)
       }
   }

...

你至少应该解释一下,让我们了解问题所在和情况。另外,请确保您的代码在``内,这样它会作为代码突出显示,我们更容易阅读您如何从userDefault、plz add code检索人员数据您是否设置了tableView的数据源?您没有使用UITableViewController,并且您的tableView数据源方法超出了viewController类是的,我已经完成了所有这些。问题是我无法在表视图cellcall tableView中显示人员数据。请在解码数据后重新加载数据。
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)
       }
   }

...