3

当我在视图中对数组使用 ForEach 循环两次时,我在运行时收到以下警告:
LazyVGridLayout: the ID 84308994-9D16-48D2-975E-DC40C5F9EFFF is used by multiple child views, this will give undefined results!

到目前为止,原因很清楚,但是解决这个问题的最聪明的方法是什么?

以下示例代码说明了该问题:

import SwiftUI

// MARK: - Model

class Data: ObservableObject
{
    @Published var items: [Item] = [Item(), Item(), Item()]
}

struct Item: Identifiable
{
    let id = UUID()
    var name: String = ""
    var description: String = ""
}

// MARK: - View

struct MainView: View {
    @StateObject var data: Data

    private var gridItems: [GridItem] { Array(repeating: GridItem(), count: data.items.count) }
    
    var body: some View {
        LazyVGrid(columns: gridItems, alignment: .leading, spacing: 2) {
            ForEach(data.items) { item in
                Text(item.name)
            }
            ForEach(data.items) { item in
                Text(item.description)
            }
        }
    }
}


// MARK: - App

@main
struct SwiftUI_TestApp: App {
    
    var body: some Scene {
        WindowGroup {
            MainView(data: Data())
        }
    }
}

我可以将视图分成几个子视图。
还有其他选择吗?

编辑:
这是真实应用程序的主体:

    var body: some View {
        VStack {
            LazyVGrid(columns: columns, alignment: .leading, spacing: 2) {
                Text("")
                ForEach($runde.players) { $player in
                    PlayerHeader(player: $player)
                }
                
                ForEach(Score.Index.allCases) { index in
                    Text(index.localizedName)
                    ForEach(runde.players) { player in
                        Cell(player: player, active: player == runde.activePlayer, index: index)
                    }
                }
                
                Text ("")
                ForEach(runde.players) { player in
                    PlaceView(player: player)
                }
            }
            .padding()
        }
    }
4

1 回答 1

7

如果你真的需要那种网格填充,那么可以为这些ForEach容器使用不同的标识符,比如

    LazyVGrid(columns: gridItems, alignment: .leading, spacing: 2) {
        ForEach(data.items) { item in
            Text(item.name).id("\(item.id)-1")      // << here !!
        }
        ForEach(data.items) { item in
            Text(item.description).id("\(item.id)-2")    // << here !!
        }
    }

使用 Xcode 13beta / iOS 15 测试

于 2021-06-26T11:31:46.913 回答