我已经为searchBar
实现了代码,如果我搜索一个人的名字或姓氏,它就可以工作。例如,如果我想搜索凯特·贝尔,那么如果我写“凯特”,搜索就可以,而如果我写“贝尔”,搜索就可以。但是,如果我写“ Kate B”,搜索结果就会消失。
这是我的代码:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchText.count == 0 {
isFiltered = false
tableViewOutlet.reloadData()
}else {
isFiltered = true
searchInternalArray = contactsInternalArray.filter({ object -> Bool in
guard let text = searchBar.text else {return false}
return object.firstName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)) || object.lastName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines))
})
searchArrayGroups = sectionsArrayGroups.filter({ object -> Bool in
guard let text = searchBar.text else {return false}
return object.firstName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)) || object.lastName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines))
})
searchArraySAEs = sectionsArraySAEs.filter ({ object -> Bool in
guard let text = searchBar.text else {return false}
return object.firstName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)) || object.lastName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines))
})
tableView.reloadData()
}
我在SO
How to search by both first name and last name
它位于objective-c
中,我很难将其实现到自己的代码中。我尝试过这样的事情:
searchInternalArray = contactsInternalArray.filter({ object -> Bool in
guard let text = searchBar.text?.range(of: object.firstName + object.lastName) else {return false}
return object.firstName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)) || object.lastName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines))
})
尽管那显然不是应该如何实现的。
编辑
认为不相关,但也许是这样:我正在过滤多个arrays
,因为我有来自三个不同来源的数据到tableView
。整个searchBar
代码类似于上面。已更新。
答案 0 :(得分:1)
为什么不只是从两个部分创建全名并基于此进行搜索。
let searchResults = contactsInternalArray.filter { object in
"\(object.firstName) \(object.lastName)".contains(searchText)
}
您仍然可以小写并根据需要进行修剪。
答案 1 :(得分:1)
除非我缺少任何东西,否则有一个更简单的解决方案:
let name = firstname.lowercased() + " " + lastname.lowercased()
return name.contains(text.lowercased())
这适用于姓氏,姓氏或两者之间有空格的部分。您可能仍应修剪前导/后缀空格,如果要消除姓氏和名字之间的可变空格问题,可以搜索/将它们替换为一个空格的双空格。
答案 2 :(得分:0)
我从flanker的答案中得到了主意。
这对我有用
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
self.searchBar.showsCancelButton = true
if searchText != ""{
self.isSearchActive = true
if self.contacts.count != 0{
filteredContacts = self.contacts.filter(){
//("\(($0 as FetchedContact).firstName.lowercased()) \(($0 as FetchedContact).lastName.lowercased()) \(($0 as FetchedContact).telephone.lowercased())")
let name = ("\(($0 as ContactModel).firstName.lowercased()) \(($0 as ContactModel).lastName.lowercased()) \(($0 as ContactModel).mobileNumber.lowercased())")
return name.contains(searchText.lowercased())
}
}
self.tblContactList.reloadData()
}
}