我正在使用List在主视图中显示模型。 当我在详细视图中更新模型时,它在详细视图中没有更新。
当我不使用List
时,详细视图会被更新。 我在使用List
方面错过了什么?
struct Person: Identifiable {
var id: UUID
var name: String
}
class PersonModel: ObservableObject {
@Published var persons: [Person] = [Person(id: UUID(), name: "Ege")]
}
struct PersonListView: View {
@StateObject private var personModel = PersonModel()
var body: some View {
NavigationView {
List {
ForEach(personModel.persons) { person in
NavigationLink(destination: PersonDetailView(person: person).environmentObject(personModel)) {
Text(person.name)
}
}
}
.navigationTitle("Persons")
}
}
}
struct PersonDetailView: View {
let person: Person
@EnvironmentObject var personModel: PersonModel
var body: some View {
VStack {
Text(person.name)
Button(action: {
let personIndex = personModel.persons.firstIndex(where: { $0.id == person.id })!
personModel.persons[personIndex].name = "Updated Name"
}) {
Text("Update")
}
}
.navigationTitle("Person Detail")
}
}
我针对List使用的解决方法:
- 为NavigationLink使用自定义绑定函数。
示例代码:
//1
private func binding(for person: Person) -> Binding<Person> {
let personIndex = personModel.persons.firstIndex(where: { $0.id == person.id }) ?? 0
return $personModel.persons[personIndex]
}
//2
NavigationLink(destination: PersonDetailView(person: binding(for: person)))
//3
@Binding var person: Person //DetailView
- 在详情视图中使用另一个
@State
,该状态在onAppear
方法中使用传递的模型进行初始化。