【问题标题】:How do I display an Array of Arrays in swiftUI如何在 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)
    }
}

【问题讨论】:

    标签: arrays foreach swiftui


    【解决方案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)")
                    }
                }
            }
        }
    }
    }
    

    【讨论】:

    • 我不确定我之前的尝试中哪里出错了,但我认为我之前尝试过但没有成功。根据您的回复,我回去了,现在它工作正常。感谢您的帮助,这是我最终采用的解决方案。
    猜你喜欢
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 2020-12-16
    • 2021-03-13
    • 2013-02-21
    • 1970-01-01
    相关资源
    最近更新 更多