Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Detail View is not updated when the model is updated (Using List) SwiftUI

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 @State in detail view which is initialized with passed model in onAppear method.
like image 855
egeeke Avatar asked Nov 26 '22 22:11

egeeke


1 Answers

This issue seems to be fixed in Xcode 13 Beta.

like image 167
egeeke Avatar answered Dec 09 '22 19:12

egeeke