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:
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
@State
in detail view which is initialized with passed
model in onAppear method.This issue seems to be fixed in Xcode 13 Beta.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With