视图中的嵌套 ForEach(和列表)给出了意想不到的结果

Posted

技术标签:

【中文标题】视图中的嵌套 ForEach(和列表)给出了意想不到的结果【英文标题】:Nested ForEach (and List) in Views give unexpected results 【发布时间】:2019-09-09 21:20:15 【问题描述】:

在 SwiftUI 视图中的另一个 ForEach 中执行 ForEach 会产生意想不到的结果 - 几乎就像他们踩到彼此的计数器一样。不清楚发生了什么。我需要显示多分支数组并尝试了多种变体,但一直遇到同样的问题

我有几个项目出现了这种情况。尝试使用范围 (0..

这只是一个测试版问题还是我遗漏了什么?我已经包含了一个演示该问题的示例项目。

使用 XCode 11 测试版 (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 被评论,它可以显示奶酪

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

【问题讨论】:

【参考方案1】:

与在此 beta 周期中使用 SwiftUI 的新 @ViewBuilder 语法产生的许多错误一样,“不明确的引用...”消息是一个红鲱鱼。您的问题是 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)

                    
                
            
        
    

然后瞧:

【讨论】:

【参考方案2】:

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

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

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

总结:每个单元格都需要一个唯一的 ID,正如您在此屏幕截图中看到的,第 7 节和第 8 节中的每个单元格都有不同的 ID。

【讨论】:

以上是关于视图中的嵌套 ForEach(和列表)给出了意想不到的结果的主要内容,如果未能解决你的问题,请参考以下文章

MVC Razor 视图嵌套 foreach 的模型

SwiftUI 嵌套列表不出现

PowerShell 中的嵌套 ForEach()

SwiftUI 使用 List 和 Foreach 遍历字典中的键并创建列表视图

SwiftUI - 列出嵌套数组中的元素

PHP嵌套foreach()给出警告:为foreach()提供的参数无效