视图中的嵌套ForEach(和列表)会产生意外结果

时间:2019-09-09 21:20:15

标签: swiftui swiftui-list

在SwiftUI视图中的另一个ForEach中执行ForEach会产生意外的结果-就像它们在彼此的计数器上踩脚一样。目前尚不清楚。我需要显示多分支数组,并尝试了多种变体,但仍然遇到相同的问题

我有几个项目已经完成。尝试使用范围(0 ..

这只是一个beta问题还是我缺少什么?我已经包含了一个演示该问题的示例项目。

使用XCode 11 Beta(11M392r)

谢谢!

import SwiftUI

struct ContentView: View {

    let topTier:[String] = ["Apple", "Banana", "Cherry"]
    let nextTier:[String] = ["Abalone", "Brie", "Cheddar"]


    var body: some View {
        List {

            ForEach (topTier.indices, id: \.self) { a in

                Text(self.topTier[a])

                ForEach (self.nextTier.indices, id: \.self) { b in

                    Text(self.nextTier[b]).padding(.leading, 20)

                }

            }
        }
    }
}

在最合适的ForEach上抛出“对成员'索引'的模糊引用”。

如果对内部ForEach进行注释,则可以显示水果 如果对外部ForEach进行评论,则可以显示奶酪

我希望它显示: 苹果  鲍鱼  布里干酪  切达 香蕉  鲍鱼  布里干酪  切达 樱桃  鲍鱼  布里干酪  切达干酪

2 个答案:

答案 0 :(得分:4)

在此Beta周期中,由于@ViewBuilder的新SwiftUI语法带来的许多错误,“模棱两可的引用…”消息是一条红色鲱鱼。您的问题是ForEach闭包需要一个视图,而不是视图构建器。

您只需将ForEach闭包的主体包装在Group中即可使视图工作,就像这样:

import SwiftUI

struct ContentView: View {

    let topTier:[String] = ["Apple", "Banana", "Cherry"]
    let nextTier:[String] = ["Abalone", "Brie", "Cheddar"]


    var body: some View {
        List {

            ForEach (topTier.indices, id: \.self) { a in
                Group {
                    Text(self.topTier[a])

                    ForEach (self.nextTier.indices, id: \.self) { b in

                        Text(self.nextTier[b]).padding(.leading, 20)

                    }
                }
            }
        }
    }
}

还有,瞧!

enter image description here

答案 1 :(得分:2)

不确定我是否完全理解您的问题,但是我遇到了类似的,可能相关的问题。 SwiftUI Nested ForEach causes unexpected ordering

我收到一个回答,指出每个单元格需要一个不同的标识符,这也可能是您遇到的问题。

每次执行嵌套的ForEach时,生成的id都是相同的,从而导致存在许多具有相同ID的单元格,从而导致意外的重新排序等出现。在链接的文章中,您可以看到我如何解决此问题。

摘要:每个单元格都需要一个唯一的ID ,如您在此屏幕截图中所见,其中第7和8节中的每个单元格都有不同的ID。