是否可以使用列表的ID在ForEach列表中使用@Binding?

时间:2019-11-23 07:33:12

标签: xcode swiftui swiftui-list

使用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的值。

1 个答案:

答案 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)")
                    }
                }
            }
        }
    }
}