在 SwiftUI ForEach 中从父级绑定到子级

Binding in SwiftUI ForEach from Parent to Child

我有一个 Subtask 定义如下:

struct Subtask: Identifiable{
  var id = UUID().uuidString
  var text = ""
}

我像这样在 ObservableObject 中填充它们的数组:

//View Model
class SubtaskModel: ObservableObject {
  static let shared = SubtaskModel()

  @Published var subtasks = [Subtask]()
  
  init(){
    //Code that creates the subtasks array
  }
}

然后我在我的父视图中开始渲染它们,如下所示:

//Parent View
struct ParentView: View {
  @StateObject var model = SubtaskModel.shared
  ...
  
  ForEach($model.subtasks) { subtask in
    ChildView(subtask: $subtask)
  }
}

为了能够在子视图中修改每个人 Subtask

//Child View
struct ChildView: View{
  @Binding var subtask: Subtask
  
  ...
  TextField("Text...", text: $subtask.text, onCommit:{
    print("Save subtask!")
  })
}

我在 ParentView 这一行中遇到错误:

ChildView(subtask: $subtask)

...也就是说:

Cannot find '$subtask' in scope

所以 ForEach 似乎没有为我的视图模型返回的每个 subtasks 返回绑定。我尝试了 ForEach 的其他变体,但仍然出现错误:

ForEach(model.subtasks) { subtask in
ForEach($model.subtasks, id: \.self) { subtask in
ForEach($model.subtasks, id: \.id) { subtask in

如何将子视图 Subtask 从父视图绑定到子视图?

您错过了 subtask 之前的 $

如果你不写$subtask,那么subtask现在就是Binding<Subtask>。这意味着您仍然可以 subtask.wrappedValue 正常使用 subtasksubtask 使用绑定,但这不是那么整洁。对于 $$subtaskBinding<Subtask>subtaskSubtask

变化:

ForEach($model.subtasks) { subtask in
    ChildView(subtask: $subtask)
}

收件人:

ForEach($model.subtasks) { $subtask in
    ChildView(subtask: $subtask)
}

或者(更令人困惑的是,我推荐):

ForEach($model.subtasks) { subtask in
    ChildView(subtask: subtask)
}