SwiftUI:按名称分组数据并显示在展开列表中
我尝试将从API获取的数据分组,并将其显示在一个扩展列表中,如 下面是一些示例数据SwiftUI:按名称分组数据并显示在展开列表中,swiftui,swiftui-list,Swiftui,Swiftui List,我尝试将从API获取的数据分组,并将其显示在一个扩展列表中,如 下面是一些示例数据 [ { "name": "Hair Cut", "createDate": 1600423060, "voucherID": 12311, "type": "service", "expiryDat
[
{
"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
dictionary(分组:self.dictions,by:{$0.name!})
将数据分组到@Published var gVouchers=dictionary()
中。现在的问题是如何在展开列表中显示它们。扩展列表使用了字典中没有的子项。那么有什么方法可以做到这一点呢?或者我无法使用字典进行分组?我已经按照教程(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)
}
}
}
我已经阅读了教程(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)
}
}
}
这是否回答了您的问题:?@Asperi for value of my dictionary将是一个数组。所以我不知道该怎么办。我尝试了
List(Array(dictionals.gVouchers.keys),id:\.self){key in Text(key)
它可以显示键,但不能显示值。这是否回答了您的问题:?@Asperi对于我字典的值将是一个数组。所以我不知道如何做。我尝试了List(Array(dictionals.gVouchers.keys),id:\.self){key in Text(key)
它可以显示键,但不能显示值。