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:按名称分组数据并显示在展开列表中的主要内容,如果未能解决你的问题,请参考以下文章