I am using List to show the models in the main view. When I update the model in detail view it is not updated in detail view.
When I don't use List, detail view is updated. What am I missing for 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")
}
}
Workarounds that I used for List:
- Using custom binding function for NavigationLink.
Example code:
//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
- Using another
@Statein detail view which is initialized with passed model in onAppear method.