带有使用数组字典的部分的 SwiftUI 列表

时间:2021-02-11 14:38:50

标签: ios swift dictionary swiftui swiftui-list

我返回了一组用户。我想按创建日期对它们进行分组,然后将它们显示在带有部分的 SwiftUI 列表中。部分标题是日期。在对用户进行分组后,我最终得到一个用户数组字典,键是将在同一日期创建的所有用户分组的日期我想将键用作一个部分,将值(用户数组)用作列表行。 List 似乎只适用于数组。任何为 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
}

1 个答案:

答案 0 :(得分:0)

您可以在 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)
        }
    }
}