У меня есть модель 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()
}
}