更新模型时不更新详细视图(使用列表)SwiftUI

ege*_*eke 5 swift swiftui combine swiftui-list

我正在使用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")
  }
}
Run Code Online (Sandbox Code Playgroud)

我用于 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
Run Code Online (Sandbox Code Playgroud)
  • 使用另一个@State在 onAppear 方法中使用传递的模型初始化的详细视图。

ege*_*eke 1

这个问题似乎在 Xcode 13 Beta 中得到了修复。