视图中的嵌套 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(和列表)给出了意想不到的结果的主要内容,如果未能解决你的问题,请参考以下文章