【问题标题】:UserDefaults with Struct - TableView not displaying data saved from UserDefaults?UserDefaults with Struct - TableView 不显示从 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()

标签: swift tableview userdefaults


【解决方案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)"
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多