问题描述
这是我第一次和最后一次设置的结构。
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