swift - 在表视图控制器中按列分隔对象
问题描述
我有一个用户对象,它包含一些字段,例如姓名、电子邮件和存储字符串数组的职业字段。
当用户创建帐户时,系统会提示他们输入最多 3 个职业选择,然后将其存储在一个数组中并以他们的用户 ID 上传到 firebase:
我有一个表格视图控制器,目的是显示所有用户,但按他们的职业分开。这个想法是允许用户根据他们的特定职业搜索其他人,以便参考,应用程序上的所有设计师都可以在标题为“设计师”的部分下的 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
}
}
解决方案
我会做一个像这样的字典:
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]
}
写得很快,如果有错误,我很抱歉,我希望它对你有帮助!
推荐阅读
- amazon-web-services - 使用自定义授权器连接到 AWS IOT 并使用 MQTT 用户名密码
- mysql - 错误代码 3078 - 外键不兼容 - 这是什么意思?
- python - 用漂亮的汤刮网困难
- google-ads-api - 如何使用 Google Ads API - PHP 库通过用户电子邮件创建或获取 Google Ads 帐户?
- java - SmbException 无法使用 Java 中的正确凭据连接主机名/IP_address throwing
- java - 从vivo 1716设备后台查杀时服务未运行
- python-3.x - 如何在python中计算给定数据帧的WAPE
- c# - 如果已在“[JsonProperty]”中定义,我可以通过其属性名称获取属性吗?
- java - 链表的通用方法
- ruby - 给定“-S”参数时的黄瓜最小测试错误