SwiftUI:按名称分组数据并显示在扩展列表中
SwiftUI: Group data by name and display in expanded list
我尝试对从 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: {[=11=].name!})
将数据分组到 @Published var gVouchers = Dictionary<String, Any>()
中。所以现在的问题是我如何在扩展列表中显示它们。扩展列表使用 children 我在字典中没有。那么有什么方法可以这样做吗?或者我不能用字典做分组?
我已经按照教程(YouTube link)学习了,你能试试下面的代码吗?(因为我还没有升级[=15,所以无法检查=])。在下面的代码中,我只是解析与您的数据一起存储在本地的 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: { [=10=].name })
self.items = dict.map { (key, value) -> ListItem in
ListItem(name: key, items: value)
}
} catch {
print(error)
}
}
}
我尝试对从 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: {[=11=].name!})
将数据分组到 @Published var gVouchers = Dictionary<String, Any>()
中。所以现在的问题是我如何在扩展列表中显示它们。扩展列表使用 children 我在字典中没有。那么有什么方法可以这样做吗?或者我不能用字典做分组?
我已经按照教程(YouTube link)学习了,你能试试下面的代码吗?(因为我还没有升级[=15,所以无法检查=])。在下面的代码中,我只是解析与您的数据一起存储在本地的 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: { [=10=].name })
self.items = dict.map { (key, value) -> ListItem in
ListItem(name: key, items: value)
}
} catch {
print(error)
}
}
}