Разделение объектов по столбцам в контроллере табличного представления - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть пользовательский объект, который принимает несколько полей, таких как имя, адрес электронной почты, и поле занятия, в котором хранится строковый массив.

Когда пользователь создает учетную запись, ему предлагается ввести до 3 профессиональных вариантов, которые затем сохраняются в массиве и загружаются в firebase под его идентификатором пользователя:

occupation node under a user's id

У меня есть контроллер табличного представления с целью отображения всех пользователей, но разделенных по их профессии. Идея состоит в том, чтобы позволить пользователям искать других людей, основываясь на их конкретной профессии, поэтому для справки все дизайнеры приложения можно найти на контроллере табличного представления в разделе «Дизайнер». В другом сценарии, если пользователь является дизайнером и разработчиком, они также должны отображаться в разделе «Разработчик».

Ключевым моментом здесь является тот факт, что пользователи вводят свое занятие вручную . Поэтому я могу просто создать массив с определенным набором профессиональных названий. Я должен получить список всех профессий, а затем отфильтровать пользователей по названию профессии. Используя помощь, полученную от уменьшенной версии этой идеи ( Меньшая версия ), я придумал функцию разделения пользователей по профессиям, но она не работает вообще:

  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
}

}

1 Ответ

0 голосов
/ 06 сентября 2018

Я бы сделал такой диктонар, как:

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]
}

Сделал это довольно быстро, поэтому извините, если в нем есть ошибки, надеюсь, он вам поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...