微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在一个 SwiftUI 视图中相同的 ForEach 循环两次

如何解决在一个 SwiftUI 视图中相同的 ForEach 循环两次

当我在一个视图中对数组使用 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,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()
        }
    }

解决方法

如果您真的需要那种网格填充,那么可以为那些 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 测试

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。