Фильтровать массив с 2 условиями одновременно? - PullRequest
0 голосов
/ 24 августа 2018

У меня есть модель User, которая загружает всех пользователей из базы данных, сохраняет их в массиве users и отображает их в UITableView. Выше UITableView у меня есть UISearchBar, чтобы позволить пользователям фильтровать их.

Поиск работает, но у пользователей есть usernames_lowercase и displayName, и я хотел бы иметь возможность фильтровать массив users для usernames_lowercase и displayName, сохранить его в searchUsers массив и затем перезагрузить / отобразить результаты. Я не могу понять, как это сделать, хотя ... и если это вообще возможно сделать с одним таким массивом.

StartNewMessage: UITableViewDelegate, UITableViewDataSource {

    var users = [UserModel]()
    var searchUsers = [UserModel]()
    var searching = false

    func numberOfSections(in tableView: UITableView) -> Int {
         return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if searching {
            return searchUsers.count
        }
        else {
            return users.count
        }
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "UsersChatTVCell") as! UsersChatTVCell
        if searching {
            let searchUser = searchUsers[indexPath.row]
            cell.user = searchUser
        }
        else {
            let user = users[indexPath.row]
            cell.user = user
        }
         return cell
    }
}

extension StartNewMessage: UISearchBarDelegate {

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        let trimmedSearchWord = searchText.trimmingCharacters(in: CharacterSet.punctuationCharacters)
        searchUsers = users.filter({ $0.username_lowercase!.prefix(searchText.count) == trimmedSearchWord.lowercased()})
        searchUsers = users.filter({ $0.displayName!.prefix(searchText.count) == searchText}) // doesn't work, basically rewrites the data
        print(searchText.lowercased())
        searching = true
        tableView.reloadData()
    }
}

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Создайте еще одну копию вашей пользовательской модели и используйте searchText, как показано ниже:

// self.Copied_User_Model -> Скопированная пользовательская модель

// User_Model -> Исходная пользовательская модель

self.Copied_User_Model = []
            for item in self.Copied_User_Model {
                if item.user_name.localizedCaseInsensitiveContains(searchText) != false  item.display_Name.localizedCaseInsensitiveContains(searchText) != false{
                    self.Copied_User_Model.append(item)
                } else {

                }
            }

            self.tableview.reloadData()
            if searchText == "" {
                self.Copied_User_Model = self.User_MOdel
                self.tableview.reloadData()
            }

Надеюсь, что это поможет.Спасибо.

0 голосов
/ 24 августа 2018

Используйте оператор || ( ИЛИ ) для указания нескольких условий.

searchUsers = users.filter {
    $0.username_lowercase!.prefix(searchText.count) == trimmedSearchWord.lowercased()
    || $0.displayName!.prefix(searchText.count) == searchText
}
...