带有使用数组字典的部分的 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 中使用字典创建一个数组,然后调用它们?

.ondelete 带有部分的 SwiftUI 列表

带有 @Binding 控件的 SwiftUI 动态列表

带有部分的 SwiftUI 动态列表无法正确布局

SwiftUI 2 - 如何防止顶部部分在 macOS 和 iPadOS 的列表中关闭

按月/年分组 FechedResults 以显示带有部分的 swiftui 列表