gpt4 book ai didi

SwiftUI 嵌套 ForEach 导致 fatal error : each layout item may only occur once

转载 作者:行者123 更新时间:2023-12-03 15:48:08 24 4
gpt4 key购买 nike

我正在尝试创建一个 LazyVGrid View ,以使用嵌套的 ForEach 语句在数组中显示对象的内容。该代码导致应用程序崩溃,并显示消息“ fatal error :每个布局项只能出现一次”。
每个对象都包含一个值数组,这些值需要在网格中显示为一行。该行包含带有对象 sku 字符串的单元格,后跟多个带有来自对象数组的整数的单元格。
我选择使用类而不是结构,因为我需要更新类中的数组。
这是数组中对象的类。

class RoomPickupData: Identifiable {
let id = UUID()
var sku: String = ""
// Array of counts for sku on a particular date
var roomsForDate: [Date: Int] = [:]
}
在代码中,第一个 ForEach 用于将标题信息放在网格的第一行。
下一个 ForEach 和嵌套在其中的 ForEach 导致错误。
外部 ForEach 遍历对象数组,因此我可以在网格中为每个对象创建一行。每行包含一个字符串,后面跟着来自 roomsForDate 数组的值。 roomsForDate 数组的大小不固定。
如果我注释掉嵌套的 ForEach 代码会执行,但我会收到 fatal error 。
如果我注释掉 Text(roomData.value.description) 以便在内部 ForEach 中有注释,则代码也可以正常运行。如果我用 Text("") 替换 Text(roomData.value.description) 应用程序崩溃。
ForEach 嵌套似乎是完成从二维数组或对象数组生成 GridView 的最佳方式,每个对象都包含一个数组。
我发现其他帖子显示嵌套的 ForEach 语句可以在 SwiftUI 中使用。
这是代码。感谢您对这个问题的帮助。
struct RoomTableView: View {
@ObservedObject var checkfrontVM: CheckFrontVM
let dateFormatter = DateFormatter()

init(checkfrontVM: CheckFrontVM) {
self.checkfrontVM = checkfrontVM
dateFormatter.dateFormat = "MM/dd/yyyy"
}

func initColumns() -> [GridItem] {
var columns: [GridItem]
var columnCount = 0

if self.checkfrontVM.roomPickupDataArray.first != nil {
columnCount = self.checkfrontVM.roomPickupDataArray.first!.roomsForDate.count
} else {
return []
}
columns = [GridItem(.flexible(minimum: 100))] + Array(repeating: .init(.flexible(minimum: 100)), count: columnCount)
return columns
}

var body: some View {
if self.checkfrontVM.roomPickupDataArray.first != nil {
ScrollView([.horizontal, .vertical]) {

LazyVGrid(columns: initColumns()) {
Text("Blank")
ForEach(self.checkfrontVM.roomPickupDataArray.first!.roomsForDate.sorted(by: {
$0 < $1
}), id: \.key) { roomData in
Text(dateFormatter.string(from: roomData.key))
}

ForEach(self.checkfrontVM.roomPickupDataArray) { roomPickupData in
Group {
Text(roomPickupData.sku)
.frame(width: 80, alignment: .leading)
.background(roomTypeColor[roomPickupData.sku])
.border(/*@START_MENU_TOKEN@*/Color.black/*@END_MENU_TOKEN@*/)
ForEach(roomPickupData.roomsForDate.sorted(by: { $0.key < $1.key}), id: \.key) { roomData in
Text(roomData.value.description)
}
}
}
}
.frame(height: 600, alignment: .topLeading)
}
.padding(.all, 10)
}
}
}

最佳答案

ForEach 中的每一项需要一个唯一的 ID。可以通过将以下行添加到内部 ForEach 的 TextView 中来修改代码分配一个唯一的 ID:.id("body\(roomPickupData.id)-\(roomData.key)")

ForEach(self.checkfrontVM.roomPickupDataArray) { roomPickupData in
Group {
Text(roomPickupData.sku)
.frame(width: 80, alignment: .leading)
.background(roomTypeColor[roomPickupData.sku])
.border(Color.black)
ForEach(roomPickupData.roomsForDate.sorted(by: { $0.key < $1.key}), id: \.key) { roomData in
Text(roomData.value.description)
.id("body\(roomPickupData.id)-\(roomData.key)") //<-
}
}
}

关于SwiftUI 嵌套 ForEach 导致 fatal error : each layout item may only occur once,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63624129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com