【问题标题】:SwiftUI: Group data by name and display in expanded listSwiftUI:按名称分组数据并显示在展开列表中
【发布时间】: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>() 中。所以现在的问题是我如何在扩展列表中显示它们。扩展列表使用我在字典中没有的孩子。那么有什么方法可以做到吗?或者我不能使用字典进行分组?

【问题讨论】:

标签: swiftui swiftui-list


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2021-04-01
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多