同时过滤具有2个条件的数组?
Filter an Array with 2 conditions at the same time?
我有一个 User
模型,它从数据库下载所有用户,将它们存储在 users
数组中并显示在 UITableView
中。在 UITableView
上方,我有一个 UISearchBar
以允许用户过滤它们。
搜索有效,但用户有一个 usernames_lowercase
和一个 displayName
,我希望能够为 usernames_lowercase
过滤 users
数组和 displayName
,将其存储在 searchUsers
数组中,然后 reload/display 结果。我不知道如何做到这一点......如果它甚至可以用这样的单个数组来做到这一点。
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({ [=10=].username_lowercase!.prefix(searchText.count) == trimmedSearchWord.lowercased()})
searchUsers = users.filter({ [=10=].displayName!.prefix(searchText.count) == searchText}) // doesn't work, basically rewrites the data
print(searchText.lowercased())
searching = true
tableView.reloadData()
}
}
使用 ||
(OR) 运算符指定多个条件。
searchUsers = users.filter {
[=10=].username_lowercase!.prefix(searchText.count) == trimmedSearchWord.lowercased()
|| [=10=].displayName!.prefix(searchText.count) == searchText
}
创建用户模型的另一个副本并使用 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()
}
希望对您有所帮助。
谢谢
我有一个 User
模型,它从数据库下载所有用户,将它们存储在 users
数组中并显示在 UITableView
中。在 UITableView
上方,我有一个 UISearchBar
以允许用户过滤它们。
搜索有效,但用户有一个 usernames_lowercase
和一个 displayName
,我希望能够为 usernames_lowercase
过滤 users
数组和 displayName
,将其存储在 searchUsers
数组中,然后 reload/display 结果。我不知道如何做到这一点......如果它甚至可以用这样的单个数组来做到这一点。
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({ [=10=].username_lowercase!.prefix(searchText.count) == trimmedSearchWord.lowercased()})
searchUsers = users.filter({ [=10=].displayName!.prefix(searchText.count) == searchText}) // doesn't work, basically rewrites the data
print(searchText.lowercased())
searching = true
tableView.reloadData()
}
}
使用 ||
(OR) 运算符指定多个条件。
searchUsers = users.filter {
[=10=].username_lowercase!.prefix(searchText.count) == trimmedSearchWord.lowercased()
|| [=10=].displayName!.prefix(searchText.count) == searchText
}
创建用户模型的另一个副本并使用 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()
}
希望对您有所帮助。 谢谢