1

我有一个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)

...说的是:

在范围内找不到“$subtask”

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

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

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

4

1 回答 1

2

你错过了$之前的subtask

如果你不写$subtask,那么subtask现在是一个Binding<Subtask>。这意味着您仍然可以正常subtask.wrappedValue使用并使用绑定,但这并不那么整洁。与,是 a并且是.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)
}
于 2021-10-06T01:02:05.533 回答