使用ParentView中的@State和ChildView中的@Binding,我们可以在打印视图和子视图中的2个变量的值之间建立连接。使用这样的代码:
ChildView(valueFromParent: $valueInParent)
使用@State在ParentView中具有valueInParent,使用@Binding在ChildView中具有valueFromParent。这样,这两个变量现在就相关了,更改一个变量将更改另一个变量。
是否可以使用行的ID号在ForEach循环中的两个视图之间进行此绑定?像这样:
ForEach((1...15), id: \.self) {item in
ChildView(valueFromParent[item]: self.$valueInParent[item])
}
我知道另一种方法-创建一个项目数组,以数组中的ID传递给列表:
@State private var list = [
(id: 0, model: ListItemModel()),
(id: 1, model: ListItemModel()),
(id: 2, model: ListItemModel()),
(id: 3, model: ListItemModel()),
(id: 4, model: ListItemModel())
]
编辑:但是我希望避免使用固定的项目列表来构成上述数组。
我想仅使用如下的ForEach循环创建一个简单的原型:ForEach((1 ... 15),id:.self)。问题是我不知道如何从列表中的特定行访问var的值。
答案 0 :(得分:0)
这是一个可能的方法演示模块。希望对您有所帮助。
更新:提供了两个变体-具有模型的数组和具有模型的字典
1。以数组作为模型容器的变体
import SwiftUI
struct Model {
var name: String
var value: Int
init(_ name: String, _ value: Int) {
self.name = name
self.value = value
}
}
struct DetailsView : View {
@Binding var item: Model
var body: some View {
HStack {
Text("Name")
TextField("", text: $item.name)
}
}
}
struct Main: View {
@State var models = [Model("A", 1), Model("B", 2), Model("C", 3), Model("D", 4)]
var body: some View {
NavigationView {
List {
ForEach(0..<models.count) { i in
NavigationLink(destination: DetailsView(item: self.$models[i])) {
Text("Model: \(self.models[i].name)")
}
}
}
}
}
}
struct DemoMainDetailByID: View {
var body: some View {
Main()
}
}
struct DemoMainDetailByID_Previews: PreviewProvider {
static var previews: some View {
DemoMainDetailByID()
}
}
2。以字典作为模型容器的变体
struct Main: View {
@State var models: [Int: Model] = [1: Model("A", 1), 2: Model("B", 2), 3: Model("C", 3), 4: Model("D", 4)]
var body: some View {
NavigationView {
List {
ForEach(1...4, id: \.self) { i in
NavigationLink(destination: DetailsView(item: Binding(self.$models[i])!)) {
Text("Model: \(self.models[i]!.name)")
}
}
}
}
}
}