在表视图控制器中按列分隔对象

时间:2018-09-05 21:34:28

标签: swift uitableview firebase

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

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

occupation node under a user's 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
}

这里两个对象如何查找参考btw:

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
}

}

1 个答案:

答案 0 :(得分:1)

我会像这样写字典:

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

然后创建一个函数,在其中将所有用户插入到该词典中,并以键作为他们的职业(如果他们的数量超过1,则只需添加具有相同值的新键)

因此,在“职业”之前,我不知道您的数据模型是什么样子,但是您需要做的就是对每个职业的子对象进行迭代,并为每个子对象取值并将其保存为键,将当前用户保存为值进入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]
}

这个过程非常快,如果出现错误,对不起,希望对您有帮助!