如何在 swiftUI 中显示数组数组

Posted

技术标签:

【中文标题】如何在 swiftUI 中显示数组数组【英文标题】:How do I display an Array of Arrays in swiftUI 【发布时间】:2021-08-22 08:42:47 【问题描述】:

在膳食计划应用中,用户选择一周中每一天所需的项目,从而为每一天创建一系列项目。然后将这些数组插入到购物清单数组中,创建一个包含所有商品的数组数组。

我一直在尝试显示组合列表。在我的代码中,我正确地返回了数组的计数,但是当我尝试显示每个数组中的项目时,我失败了。任何帮助将不胜感激!

这是我正在尝试做的一个简化示例:

import SwiftUI

struct ShoppingListView: View 
    
    var shoppingList: Array<Array<String>>

    
    var body: some View 
        VStack(alignment: .leading) 
            ForEach(0..<shoppingList.count, id: \.self) list in
                Text("number of arrays")
                VStack 
                    List(0..<list)  item in
                        Text("item = \(item)")
                    
                
            
        
    


struct ShoppingListView_Previews: PreviewProvider 
    static var previews: some View 
        let list = [["eggs", "bread", "milk", "cheese" ],["steak", "potatoes", "salad kit"]]
        ShoppingListView(shoppingList: list)
    

【问题讨论】:

【参考方案1】:

首先,在ForEachList 中使用较新的0..&lt;shoppingList.count,因为当您更改项目计数时,您将面临列表未更新的问题,例如this case。请改用shoppingList.indices

您正在枚举索引,但看起来您希望在块中获得一个项目。这不会发生。

为您的物品完美地创建一个struct 并使其符合Identifiable,然后您将能够调用ForEach(shoppingList) 并将您的物品放入块中。

在此之前,您可以毫无问题地使用枚举索引,只需从列表中按索引获取您的项目:

var shoppingList: Array<Array<String>> = [["eggs", "bread", "milk", "cheese" ],["steak", "potatoes", "salad kit"]]

var body: some View 
    VStack(alignment: .leading) 
        ForEach(shoppingList.indices, id: \.self)  i in
            Text("number of arrays")
            let sublist = shoppingList[i]
            VStack 
                List(sublist.indices, id: \.self)  j in
                    Text("item = \(sublist[j])")
                
            
        
    

【讨论】:

感谢您的回复,这很有帮助! @TJMac:定义你想要的东西的正确方法是Array&lt;Array&lt;String&gt;&gt; 当数据发生变化时,基于索引的事情并不是很好,因为过去是 bread 的东西现在在 eggs 所在的行中。可能会导致那些不稳定的标识符警告并导致奇怪的动画。我认为像@workingdog 这样的名字做ID是一种更可靠的方法。但是,是的,indices 更好,因为像 ArraySlice 这样的东西并不总是从索引 0 开始。理想情况下,这个购物清单中的项目将是它们自己的结构,只要它们存在,每个项目都有自己的结构唯一且不变的 ID。【参考方案2】:

你可以这样做:

struct ShoppingListView: View 

var shoppingList: [[String]] = [["1","2","3"], ["4","5","6"], ["7","8"]]

var body: some View 
    VStack(alignment: .leading) 
        Text("number of arrays is \(shoppingList.count)")
        ForEach(shoppingList, id: \.self)  list in
            VStack 
                List(list, id: \.self)  item in
                    Text("item = \(item)")
                
            
        
    


【讨论】:

我不确定我之前的尝试中哪里出错了,但我认为我之前尝试过但没有成功。根据您的回复,我回去了,现在它工作正常。感谢您的帮助,这是我最终采用的解决方案。

以上是关于如何在 swiftUI 中显示数组数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在数组大小更改后刷新 ForEach 显示元素的数量(SwiftUI,Xcode 11 Beta 5)

如何将 SwiftUI 视图绑定到数组中元素的属性

如何使用 .reversed() 处理 SwiftUI 列表数组的 .onDelete

从数组中显示带有名称的随机图像。 (SwiftUI)

如何在 SwiftUI 中追加到数组?

如何在 SwiftUI 中订阅数组的大小?