我有一个采用ObservableObject
协议的activity类,并具有一个items
数组属性,该属性存储也采用ObservableObject
的activity对象。
class activity: ObservableObject,Codable,Identifiable {
let id = UUID()
@Published var title: String
@Published var description: String
@Published var numberOfTimesCompleted: Int = 0
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(title,forKey: .title)
try container.encode(description,forKey: .description)
try container.encode(numberOfTimesCompleted,forKey: .numberOfTimesCompleted)
}
init(title: String,description: String) {
self.title = title
self.description = description
numberOfTimesCompleted = 0
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
title = try container.decode(String.self,forKey: .title)
description = try container.decode(String.self,forKey: .description)
numberOfTimesCompleted = try container.decode(Int.self,forKey: .numberOfTimesCompleted)
}
}
class activities: ObservableObject {
@Published var items: [activity] {
didSet {
let encoder = JSONEncoder()
if let encoded = try? encoder.encode(items) {
UserDefaults.standard.set(encoded,forKey: "items")
}
}
}
init() {
if let items = UserDefaults.standard.data(forKey: "items") {
let decoder = JSONDecoder()
if let decoded = try? decoder.decode([activity].self,from: items) {
self.items = decoded
return
}
}
self.items = []
}
}
我正在使用List
这样动态显示我的数组
List {
ForEach(activities.items) { activity in
NavigationLink(destination: activityView(activity: activity)) {
HStack {
Text("\(activity.numberOfTimesCompleted)")
VStack(alignment: .leading) {
Text(activity.title)
Text(activity.description)
}
}
}
}
}
当我将“活动”传递到另一个视图(在NavigationLink中)并编辑numberOfTimesCompleted
属性时,当我导航回到列表时,更改不会反映出来。如果将新的activity实例添加到列表中,列表将更新,并且新的numberOfTimesCompleted
值会反映在我之前编辑的activity中。我有一种接近的感觉,但是我正在学习Swift和ObservableObject,因此缺少一些东西。