为什么我不能使用 searchBar 搜索名字和姓氏?
Why can't I search both first and last names using searchBar?
我已经为 searchBar
实现了代码,如果我搜索一个人的名字或姓氏,它就可以工作。例如,如果我想搜索 Kate Bell,如果我写 "Kate" 就可以搜索,如果我写 "Bell" 就可以搜索。但是如果我写 "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
代码如上所示。已更新。
为什么不直接从这两个部分创建全名并以此为基础进行搜索。
let searchResults = contactsInternalArray.filter { object in
"\(object.firstName) \(object.lastName)".contains(searchText)
}
您仍然可以将它们小写,并且 trim 如果您愿意的话。
除非我遗漏了什么,否则有一个更简单的解决方案:
let name = firstname.lowercased() + " " + lastname.lowercased()
return name.contains(text.lowercased())
这适用于名字、姓氏的任何部分,或两者之间带有 space 的部分。你应该仍然 trim leading/trailing spaces,如果你想摆脱名字和姓氏之间变量 spaces 的问题,你可以 search/replace 他们加倍 spaces 和一个 space.
我从的回答中得到了灵感。
这对我有用
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
self.searchBar.showsCancelButton = true
if searchText != ""{
self.isSearchActive = true
if self.object.count != 0{
filteredContacts = self. object.filter(){
//("\(([=10=] as FetchedContact).firstName.lowercased()) \(([=10=] as FetchedContact).object.lowercased()) \(([=10=] as FetchedContact).telephone.lowercased())")
let name = ("\(([=10=] as ContactModel).firstName.lowercased()) \(([=10=] as ContactModel).lastName.lowercased()) \(([=10=] as ContactModel).mobileNumber.lowercased())")
return name.contains(searchText.lowercased())
}
}
self.tblContactList.reloadData()
}
}
- 根据名字、姓氏和手机号码搜索联系人。
我已经为 searchBar
实现了代码,如果我搜索一个人的名字或姓氏,它就可以工作。例如,如果我想搜索 Kate Bell,如果我写 "Kate" 就可以搜索,如果我写 "Bell" 就可以搜索。但是如果我写 "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
代码如上所示。已更新。
为什么不直接从这两个部分创建全名并以此为基础进行搜索。
let searchResults = contactsInternalArray.filter { object in
"\(object.firstName) \(object.lastName)".contains(searchText)
}
您仍然可以将它们小写,并且 trim 如果您愿意的话。
除非我遗漏了什么,否则有一个更简单的解决方案:
let name = firstname.lowercased() + " " + lastname.lowercased()
return name.contains(text.lowercased())
这适用于名字、姓氏的任何部分,或两者之间带有 space 的部分。你应该仍然 trim leading/trailing spaces,如果你想摆脱名字和姓氏之间变量 spaces 的问题,你可以 search/replace 他们加倍 spaces 和一个 space.
我从
这对我有用
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
self.searchBar.showsCancelButton = true
if searchText != ""{
self.isSearchActive = true
if self.object.count != 0{
filteredContacts = self. object.filter(){
//("\(([=10=] as FetchedContact).firstName.lowercased()) \(([=10=] as FetchedContact).object.lowercased()) \(([=10=] as FetchedContact).telephone.lowercased())")
let name = ("\(([=10=] as ContactModel).firstName.lowercased()) \(([=10=] as ContactModel).lastName.lowercased()) \(([=10=] as ContactModel).mobileNumber.lowercased())")
return name.contains(searchText.lowercased())
}
}
self.tblContactList.reloadData()
}
}
- 根据名字、姓氏和手机号码搜索联系人。