如何解决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
中,dataSource
和 delegate
默认连接。
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 举报,一经查实,本站将立刻删除。