ios - 带有使用数组字典的部分的 SwiftUI 列表
问题描述
我返回了一组用户。我想按创建日期对它们进行分组,然后在带有部分的 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
}
解决方案
您可以在内部使用部分List
,并使用其 header 参数来传递Dates。我已经[String]
通过使用单独的函数获取了所有日期。您需要考虑的一件事是您将传递多个键以获取您将拥有的不同日期键的数据的方式。可能您可以先使用[Users]
对象创建它并保存所有键。
以下是您的问题的解决方案-:
内容视图-:
//// 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)
}
}
}
推荐阅读
- angular - 如何构建指向我的 Angular 应用程序路由之一的链接?
- nativescript - 如何从 NativeScript 中的 Image 获取文件并将其上传到服务器
- mysql - LEFT JOIN 查询不返回预期结果
- html - Angular - 如何设置我的表单以容纳所有字段数据
- python-sphinx - sphinx autofunction 在本地运行良好,但在服务器上运行良好
- python - 使用应用服务在 Microsoft Azure 中上传 python 脚本时出现问题
- c# - 要遵循哪些 .Net Core 2.3 + MongoDB 指南?
- laravel - Laravel 的 belongsTo 关系返回 null
- spring-boot - 带有两个 jar 文件的 Docker 容器,按需运行而不是作为入口点
- react-admin - 在 react-admin 字段中指定内部组件