带有使用数组字典的部分的 SwiftUI 列表
Posted
技术标签:
【中文标题】带有使用数组字典的部分的 SwiftUI 列表【英文标题】:SwiftUI List with sections using dictionary of array 【发布时间】:2021-02-11 14:38:50 【问题描述】:我返回了一组用户。我想按创建日期对它们进行分组,然后在带有部分的 SwiftUI 列表中显示它们。部分标题是日期。在我对用户进行分组后,我最终得到一个用户数组字典,键是将在同一日期创建的所有用户分组的日期,我想将键用作部分,将值(用户数组)用作列表行。似乎 List 仅适用于数组。任何干净的解决方案来为列表准备数据以便它可以显示部分及其内容?
import SwiftUI
import Combine
struct ContentView: View
@EnvironmentObject var interactor: Interactor
var body: some View
List(interactor.users) user in // Error: Cannot convert value of type '[String : [User]]' to expected argument type 'Range<Int>'
.onAppear
interactor.loadUsers()
class Interactor: ObservableObject
@Published private(set) var users = [String: [User]]()
func loadUsers()
let allUsers = [User(id: "1", name: "Joe", createdAt: Date()),
User(id: "2", name: "Jak", createdAt: Date())]
users = Dictionary(grouping: allUsers) user in
let dateFormatted = DateFormatter()
dateFormatted.dateStyle = .short
return dateFormatted.string(from: user.createdAt)
struct User: Identifiable
let id: String
let name: String
let createdAt: Date
【问题讨论】:
这能回答你的问题吗:***.com/questions/56675532/… 并非如此。我正在寻找我们更好的数据结构,我可以使用它来将其映射到带有部分的列表 【参考方案1】:您可以使用List
中的部分,并利用其标题参数传递日期。我已经使用单独的函数将所有日期作为[String]
获取。您需要弄清楚的一件事是您将传递多个键以获取您将拥有的不同日期键的数据的方式。也许您可以先使用 [Users]
对象创建它并保存所有键。
以下是您的问题的解决方案-:
ContentView-:
//// Created by TUSHAR SHARMA on 06/02/21.
////
//
import SwiftUI
struct ContentView: View
@EnvironmentObject var interactor: Interactor
var body: some View
List
ForEach(getAllDates(),id:\.self) dates in
Section(header: Text(dates))
ForEach(interactor.users[dates] ?? []) users in
Text(users.name)
func getAllDates() -> [String]
let getObjects = interactor.users[Date().stringFromDate()] ?? []
var dateArray : [String] = []
for getData in getObjects
dateArray.append(getData.createdAt.stringFromDate())
let unique = Array(Set(dateArray))
return unique
extension Date
func stringFromDate() -> String
let dateFormatted = DateFormatter()
dateFormatted.dateStyle = .short
return dateFormatted.string(from: self)
class Interactor: ObservableObject
@Published private(set) var users = [String: [User]]()
init()
loadUsers()
func loadUsers()
let allUsers = [User(id: "1", name: "Joe", createdAt: Date()),
User(id: "2", name: "Jak", createdAt: Date())]
users = Dictionary(grouping: allUsers) user in
user.createdAt.stringFromDate()
struct User: Identifiable
let id: String
let name: String
let createdAt: Date
@主视图
// Created by TUSHAR SHARMA on 07/01/21.
//
import SwiftUI
@main
struct WaveViewApp: App
let interactor = Interactor()
var body: some Scene
WindowGroup
ContentView().environmentObject(interactor)
【讨论】:
以上是关于带有使用数组字典的部分的 SwiftUI 列表的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SwiftUI 中使用字典创建一个数组,然后调用它们?