首页 > 解决方案 > 带有使用数组字典的部分的 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
}

标签: iosswiftdictionaryswiftuiswiftui-list

解决方案


您可以在内部使用部分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)
        }
    }
}

推荐阅读