在 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
正常使用 subtask
和 subtask
使用绑定,但这不是那么整洁。对于 $
,$subtask
是 Binding<Subtask>
,subtask
是 Subtask
。
变化:
ForEach($model.subtasks) { subtask in
ChildView(subtask: $subtask)
}
收件人:
ForEach($model.subtasks) { $subtask in
ChildView(subtask: $subtask)
}
或者(更令人困惑的是,我不推荐):
ForEach($model.subtasks) { subtask in
ChildView(subtask: subtask)
}
我有一个 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
正常使用 subtask
和 subtask
使用绑定,但这不是那么整洁。对于 $
,$subtask
是 Binding<Subtask>
,subtask
是 Subtask
。
变化:
ForEach($model.subtasks) { subtask in
ChildView(subtask: $subtask)
}
收件人:
ForEach($model.subtasks) { $subtask in
ChildView(subtask: $subtask)
}
或者(更令人困惑的是,我不推荐):
ForEach($model.subtasks) { subtask in
ChildView(subtask: subtask)
}