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