首页 > 解决方案 > 在表视图控制器中按列分隔对象

问题描述

我有一个用户对象,它包含一些字段,例如姓名、电子邮件和存储字符串数组的职业字段。

当用户创建帐户时,系统会提示他们输入最多 3 个职业选择,然后将其存储在一个数组中并以他们的用户 ID 上传到 firebase:

用户id下的占领节点

我有一个表格视图控制器,目的是显示所有用户,但按他们的职业分开。这个想法是允许用户根据他们的特定职业搜索其他人,以便参考,应用程序上的所有设计师都可以在标题为“设计师”的部分下的 tableview 控制器上找到。在另一种情况下,如果用户是设计师和开发人员,他们也应该出现在开发人员下。

这里的关键部分是用户手动输入他们的职业这一事实。所以我可以创建一个包含一组特定职业头衔的数组。我必须获取所有职业的列表,然后根据职业名称过滤用户。使用我从这个想法的较小版本(Smaller Version)中获得的帮助,我想出了一个按用户职业分隔用户的功能,但它根本不起作用:

  func getOccupations() -> [IndexedOccupations] {
    while !users.isEmpty {

    //-- filter the users
        guard let referencedUser = users.first else { return [] }
        for x in (referencedUser.occupation?.count)! {
            let filteredUsers = users.filter { (user) -> Bool in
                for y in user.occupation.count {
                    return user.occupation[y] == referencedUser.occupation[x]
                }
                return false
            }

    //-- create an occupation object with an occupation name, and list of filtered users & return occupations
            let indexedOccupation = IndexedOccupations(occupation: referencedUser.occupation[x]!, users: filteredUsers)
            occupations.append(indexedOccupation)
        }}

    return occupations
}

这是两个对象如何寻找参考顺便说一句:

class User: NSObject {

//-- things that a User will have stored
var id: String?
var bio: String?
var city: String?
var name: String?
var email: String?
var picture: String?
var state: String?
var links: [String]?
var playerID: String?
var occupation: [String]?

    //-- initializer method
    init(dictionary: [String: AnyObject]) {
        self.id = dictionary["id"] as? String
        self.name = dictionary["Name"] as? String
        self.email = dictionary["Email"] as? String
        self.city = dictionary["City"] as? String
        self.state = dictionary["State"] as? String
        self.picture = dictionary["Picture"] as? String
        self.bio = dictionary["Bio"] as? String
        self.playerID = dictionary["playerID"] as? String
        self.links = dictionary["Links"] as? [String]
        self.occupation = dictionary["Occupation"] as? [String]
    }

}

和职业:

class IndexedOccupations: NSObject {

//-- things that a user will have stored
var occupation: String?
var users: [User]

//-- initializer method
init(occupation: String, users: [User]) {
    self.occupation = occupation
    self.users = users
}

}

标签: swiftuitableviewfirebase

解决方案


我会做一个像这样的字典:

var userByOccupation: [String: [User]] = []

然后创建一个函数,在此字典中插入所有用户,键为他们的职业(如果他们有超过 1 个,只需添加具有相同值的新键)

所以我不知道你的数据模型在 Occupations 之前是什么样子,但你需要做的只是迭代 Occupations 的每个孩子,并为每个孩子取值并将这个值保存为键,并将当前用户作为值保存到 userByOccupation大批。

所以首先获取当前用户,然后:

 ref?.child("Occupation").observeSingleEvent(of: .value, with: { (snapshot) in
            let enumerator = snapshot.children
            while let rest = enumerator.nextObject() as? DataSnapshot{
                if let occupation = rest.key as? String{
                    //And here insert OCCUPATION/USER like
                    if (userByOccupation[occupation] != nil) {
                       userByOccupation[occupation]?.append(user)
                    } else {
                       userByOccupation[occupation] = [user]
                    }
                }
            }
        })

编辑评论问题:

我不知道这是否是最好的解决方案,但这就是我的做法。加载字典后,只需像这样创建一个包含所有键的数组

allOccupations = Array(userByOccupation.keys)

在此之后,您可以订购这个数组,例如 -> 字典是无序的!

接着:

override func numberOfSections(in tableView: UITableView) -> Int {
    return allOccupations.count
}

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return allOccupations[section]
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return userByOccupation[allOccupations[section]].count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    // Then get the user like this
   guard let allUsers = userByOccupation[allOccupations[section]] else {
   return }
   let currentUser = allUsers[indexPath.row]
}

写得很快,如果有错误,我很抱歉,我希望它对你有帮助!


推荐阅读