SwiftUI:如何遍历可绑定对象的数组?

eiv*_*dml 10 binding swift swiftui

我正在尝试学习SwiftUI,以及绑定如何工作。

我有这段代码有效,它显示了一个项目列表。轻按一个项目后,对该项目的绑定将传递给子视图:

struct ProjectsView: View {
  @ObjectBinding var state: AppState
  @State var projectName: String = ""

  var body: some View {
    NavigationView {
      List {
        ForEach(0..<state.projects.count) { index in
          NavigationLink(destination: ProjectView(project: self.$state.projects[index])) {
            Text(self.state.projects[index].title)
          }
        }
      }
      .navigationBarTitle("Projects")
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

子视图,我在其中使用绑定对项目进行变异:

struct ProjectView: View {
  @Binding var project: Project
  @State var projectName: String = ""

  var body: some View {
    VStack {
      Text(project.title)
      TextField(
        $projectName,
        placeholder: Text("Change project name"),
        onCommit: {
          self.project.title = self.projectName
          self.projectName = ""
      })
      .padding()
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,我宁愿在不使用索引的情况下遍历project数组(因为我想学习,并且更容易阅读),但是不确定如何将绑定传递给单个项目。我像这样尝试过,但是后来我无法访问project.title,因为它是一个绑定,而不是字符串。

ForEach($state.projects) { project in
  NavigationLink(destination: ProjectView(project: project)) {
    Text(project.title)
  }
}
Run Code Online (Sandbox Code Playgroud)

我该如何实现?

Eug*_*ene 2

我有点陷入与您相同的问题,并且我找到了部分解决方案。但首先我应该指出,迭代索引ForEach(0..<state.projects.count) { index in ... }不是一个好主意,因为index是一个 Int,它不符合 Identificate。因此,当数组更改时,UI 将不会更新,并且您将在控制台中看到警告。

state.projects我的解决方案在创建ProjectView和使用时直接访问数组firstIndex(of:)以获取项目元素的可绑定形式。这有点令人讨厌,但这是我能做到的让它更加 SwiftUI 化。

ForEach(state.projects) { project in
  NavigationLink(destination: ProjectView(project: self.$state.projects[self.state.projects.firstIndex(of: project)!]))) {
    Text(project.title)
  }
}
Run Code Online (Sandbox Code Playgroud)