0

在 ParentView 中使用 @State 和在 ChildView 中使用 @Binding,我们可以在打印视图和子视图中的 2 个变量的值之间建立连接。使用这样的代码:

ChildView(valueFromParent: $valueInParent)

在 ParentView 中使用 @State 和 valueFromParent 在 ChildView 中使用 @Binding。这样,这两个变量现在是相关的,改变一个变量会改变另一个变量。

是否可以使用行的 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 的值。

4

1 回答 1

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)")
                    }
                }
            }
        }
    }
}
于 2019-11-23T08:36:12.580 回答