SwiftUI:按名称分组数据并显示在展开列表中

Posted

技术标签:

【中文标题】SwiftUI:按名称分组数据并显示在展开列表中【英文标题】:SwiftUI: Group data by name and display in expanded list 【发布时间】:2020-09-22 03:14:31 【问题描述】:

我尝试对从 API 获取的数据进行分组,并将其显示在扩展列表中,例如 How to create expanding lists – SwiftUI 这是一些示例数据。

[
    
        "name": "Hair Cut",
        "createDate": 1600423060,
        "voucherID": 12311,
        "type": "service",
        "expiryDate": 1600682257,
        "trxnID": 2683125
    ,
    
        "name": "Hair Cut",
        "createDate": 1600423060,
        "voucherID": 31231,
        "type": "service",
        "expiryDate": 1600682257,
        "trxnID": 2683124
    ,
    
        "name": "Package B",
        "createDate": 1596217117,
        "voucherID": 12312,
        "type": "service",
        "expiryDate": 0,
        "trxnID": 2423309
    
]

现在我已经使用字典 Dictionary(grouping: self.vouchers, by: $0.name!) 将数据分组到 @Published var gVouchers = Dictionary<String, Any>() 中。所以现在的问题是我如何在扩展列表中显示它们。扩展列表使用我在字典中没有的孩子。那么有什么方法可以做到吗?或者我不能使用字典进行分组?

【问题讨论】:

这是否回答了您的问题:***.com/a/61441076/12299030? @Asperi 我的字典的值将是一个数组。所以我不知道该怎么做。我试过List(Array(vouchers.gVouchers.keys), id:\.self)key in Text(key)它可以显示键但不能显示值。 docs.swift.org/swift-book/LanguageGuide/CollectionTypes.html 【参考方案1】:

我已经按照教程(YouTube 链接)进行了操作,您可以试试下面的代码吗?(因为 我无法检查,因为我还没有升级 Xcode)。在下面的代码中,我只是用您的数据解析本地存储的 JSON 文件。

struct ListItem: Decodable, Identifiable 
    let id = UUID()
    var name: String
    var createDate: TimeInterval?
    var voucherID: Int?
    var type: String?
    var expiryDate: TimeInterval?
    var trxnID: Int?
    var items: [ListItem]?
    
    init(name: String, items: [ListItem]) 
        self.name = name
        self.items = items
    


struct ContentView: View 
    @State private var items: [ListItem] = []
    
    var body: some View 
        List(items, children: \.items)  item in
            Text(item.name)
        .onAppear 
            self.parseJSON()
        
    
    
    func parseJSON() 
        guard let filePath = Bundle.main.url(forResource: "demo", withExtension: "json") else 
            items = []
            return
        
        
        do 
            let data = try Data(contentsOf: filePath)
            let results = try JSONDecoder().decode([ListItem].self, from: data)
            let dict = Dictionary(grouping: results, by:  $0.name )
            self.items = dict.map  (key, value) -> ListItem in
                ListItem(name: key, items: value)
            
         catch 
            print(error)
        
    

【讨论】:

以上是关于SwiftUI:按名称分组数据并显示在展开列表中的主要内容,如果未能解决你的问题,请参考以下文章

按月/年分组 FechedResults 以显示带有部分的 swiftui 列表

SwiftUI:导航在带有部分的列表中无法正常工作

带有使用数组字典的部分的 SwiftUI 列表

Django - 分组数据并在模板中显示选择的名称

在mongodb中按月份和日期分组并显示列表

Django - 分组数据并在模板中显示外键的名称