【问题标题】:Using SwiftUI ForEach's iterator variable in a binding call在绑定调用中使用 SwiftUI ForEach 的迭代器变量
【发布时间】:2020-02-13 14:47:45
【问题描述】:

我正在尝试在需要绑定的视图中使用 ForEach 的迭代器变量。

import SwiftUI

struct MyStruct: Identifiable {
    public var id = UUID()
    var name: String
    var repetitions: Int

}

struct ContentView: View {
    @State private var mystructs :[MyStruct] = [
        MyStruct(name: "John", repetitions: 3),
        MyStruct(name: "Mark", repetitions: 9)
    ]

    var body: some View {

        List {
            ForEach (mystructs) { st in
                VStack {
                    Text("\(st.name)")
                    TextField("Name", text: self.$mystructs[0].name)
                    TextField("Name", text: $st.name) // <- Got "Ambiguous reference..." error
                }
            }
        }
    }
}

ForEach 迭代器有效,正如 Text 视图对 st.name 的使用所证明的那样。第一个 TextField 演示了绑定到 mystructs 元素的工作。但是,对于第二个 TextField 这是我的真实用例,会导致以下编译器错误:

- Use of unresolved identifier $st
- Ambiguous reference to member of 'subscript'

有什么想法吗?

【问题讨论】:

  • 你想做什么?
  • 尝试使列表动态化,我可以在其中添加/删除数组元素并同时修改元素。这是一个简化的代码sn-p;在我的代码中,我有一个自定义 View 而不是 TextField 并且需要绑定。

标签: ios swiftui


【解决方案1】:

$st 未解决,因为 'st' 不是状态变量,不能用于绑定目的。
$mystructs 也可以工作,因为它被声明为 State 变量并且可以用于绑定。

希望这对你有用!谢谢!

【讨论】:

    【解决方案2】:

    在所描述的场景中,可以完成以下操作

    ForEach (mystructs.indices) { i in
        VStack {
            Text("\(self.mystructs[i].name)")
            TextField("Name", text: self.$mystructs[i].name)
        }
    }
    

    更新: 更通用用例的变体

    ForEach (Array(mystructs.enumerated()), id: \.element.id) { (i, item) in
        VStack {
            Text("\(item.name)")
            TextField("Name", text: self.$mystructs[i].name)
        }
    }
    

    【讨论】:

    • 谢谢,但不幸的是,在我的实际用例中,数组中的元素数量也会发生变化。例如。如果视图中某处的按钮将另一个元素附加到数组中,则视图不会显示新元素,因为计数将保持不变,尽管没有编译器错误。
    • @Hampden123,通用案例也有变体,请参阅更新。
    【解决方案3】:

    基于@Asperi 的回答,这也有效:

    var body: some View {
        List {
            Button("Add") {
                self.mystructs.append(MyStruct(name: "Pepe", repetitions: 42))
            }
            ForEach(mystructs.indices, id: \.self) { index in
                VStack {
                    Text(self.mystructs[index].name)
                    TextField("Name", text: self.$mystructs[index].name)
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-02
      • 1970-01-01
      • 2021-12-22
      • 2021-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多