如何允许 ForEach 布局项在 SwiftUI 中显示数组中的重复项?

Naz*_*san 1 foreach swift swiftui lazyvgrid

我正在开发多项选择答案测验应用程序。

var itemsTemp = ["ant","bat", "bear", "bee", "bird", "butterfly", "camel", "cat", "cheetah","chick", "chicken"]
Run Code Online (Sandbox Code Playgroud)

更新了 这里是我的测验应用程序的示例。

  let answerIndex = Int.random(in: 0...3) // for correct answer
  itemsTemp!.shuffle() // to multiple choose option change. 
Run Code Online (Sandbox Code Playgroud)

这是错误:

线程 1:致命错误:每个布局项只能出现一次

波纹管代码崩溃

LazyVGrid(columns: [GridItem(),GridItem()],spacing: 16) {
       ForEach(itemsTemp) { item in
            VStack {
                    Text(item).id(UUID())
                      .matchedGeometryEffect(id:UUID(), in: namespace, isSource: !show)
                      .onTapGesture{
                               print(" tapped!")
                        }
                    }.matchedGeometryEffect(id: "container\(UUID())", in: namespace)
                 }
              }
Run Code Online (Sandbox Code Playgroud)

这是一个测验应用程序,因此可以选择多个选项来选择正确的答案。数组项将在每个循环中多次出现。

所以需要每个布局项多次出现。

Raj*_*han 7

为唯一标识符。使用模型数组而不是字符串数组。

首先,创建一个模型。

struct Item: Identifiable {
    var id = UUID()
    var name: String
}
Run Code Online (Sandbox Code Playgroud)

那么,你的数组是

var itemsTemp: [Item] = [
    .init(name: "ant"),
    .init(name: "bat"),
    .init(name: "ant"),
    .init(name: "bear"),
    .init(name: "bee"),
    .init(name: "ant"),
    .init(name: "butterfly"),
    .init(name: "bear")
]
Run Code Online (Sandbox Code Playgroud)

现在,你的循环是

//Other Code
ForEach(itemsTemp, id:\.id) { item in
    //Other Code
}
//Other Code
Run Code Online (Sandbox Code Playgroud)

第二种方法是使用.indices.

//Other Code
ForEach(itemsTemp.indices) { index in
    let item = temsTemp[index]
    //Other Code
}
//Other Code
Run Code Online (Sandbox Code Playgroud)