如何过滤 searchBar 中的整个对象
How do I filter entire object in searchBar
在我的 Xcode
项目中,我有一个 tableView
和 list
数据。我已经实现了 searchBar
来过滤用户输入。我希望它过滤我的整个对象 var contactArray = [ExternalAppContactsBook]()
,但出于某种原因,我只能过滤它的属性,例如 contactArray.firstName
。这是 searchbar
函数中的样子:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchBar.text?.count == 0 {
isFiltered = false
}else {
print("HELLO")
isFiltered = true
filteredName = contactArray.filter({[=10=].firstName.lowercased().prefix(searchText.count) == searchText})
}
tableViewOutlet.reloadData()
}
所以,我想要 [=23=].prefix
而不是 [=22=].firstName
,但是编译器说没有这样的 属性。
使用 [=22=].firstName
我只能搜索列表中的名字,这非常有限...我正在以正确的方式解决这个问题,或者我应该怎么做?
编辑
ExternalAppContactsBook 看起来像这样:
class ExternalAppContactsBook {
var firstName = ""
var lastName = ""
var phoneNumber = ""
var company = ""
}
我重写了我的代码,但我 运行 遇到了同样的问题。这就是我现在在 searchBar textDidChange
:
中得到的
filteredName = contactArray.filter({ object -> Bool in
guard let text = searchBar.text else {return false}
return object.firstName.contains(text)
})
这有效,但仅当我搜索列表中人员的名字时才有效。我也希望能够搜索他们的姓氏。
所以我尝试添加另一个:
filteredLastName = contactArray.filter({ object -> Bool in
guard let text = searchBar.text else {return false}
return object.lastName.contains(text)
})
然后在cellForRowAt
_
if isFiltered {
contactName = filteredName[indexPath.row].firstName
contactLastName = filteredLastName[indexPath.row].lastName
...}
但这显然行不通,并提供了一个问题,即 numberOfRowsInSection
中应返回多少 rows
您可以在过滤时简单地使用带 OR (||) 的条件
let filteredName = contactArray.filter {[=10=].firstName.starts(with: searchStr) || [=10=].lastName.starts(with: searchStr)}
您也可以将其作为函数添加到您的 class
func isMatch(_ searchString: String) -> Bool {
return firstName.starts(with: searchString) || lastName.starts(with: searchString)
}
然后过滤
let filteredName = contactArray.filter {[=12=].isMatch(searchStr)}
在我的 Xcode
项目中,我有一个 tableView
和 list
数据。我已经实现了 searchBar
来过滤用户输入。我希望它过滤我的整个对象 var contactArray = [ExternalAppContactsBook]()
,但出于某种原因,我只能过滤它的属性,例如 contactArray.firstName
。这是 searchbar
函数中的样子:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchBar.text?.count == 0 {
isFiltered = false
}else {
print("HELLO")
isFiltered = true
filteredName = contactArray.filter({[=10=].firstName.lowercased().prefix(searchText.count) == searchText})
}
tableViewOutlet.reloadData()
}
所以,我想要 [=23=].prefix
而不是 [=22=].firstName
,但是编译器说没有这样的 属性。
使用 [=22=].firstName
我只能搜索列表中的名字,这非常有限...我正在以正确的方式解决这个问题,或者我应该怎么做?
编辑 ExternalAppContactsBook 看起来像这样:
class ExternalAppContactsBook {
var firstName = ""
var lastName = ""
var phoneNumber = ""
var company = ""
}
我重写了我的代码,但我 运行 遇到了同样的问题。这就是我现在在 searchBar textDidChange
:
filteredName = contactArray.filter({ object -> Bool in
guard let text = searchBar.text else {return false}
return object.firstName.contains(text)
})
这有效,但仅当我搜索列表中人员的名字时才有效。我也希望能够搜索他们的姓氏。
所以我尝试添加另一个:
filteredLastName = contactArray.filter({ object -> Bool in
guard let text = searchBar.text else {return false}
return object.lastName.contains(text)
})
然后在cellForRowAt
_
if isFiltered {
contactName = filteredName[indexPath.row].firstName
contactLastName = filteredLastName[indexPath.row].lastName
...}
但这显然行不通,并提供了一个问题,即 numberOfRowsInSection
rows
您可以在过滤时简单地使用带 OR (||) 的条件
let filteredName = contactArray.filter {[=10=].firstName.starts(with: searchStr) || [=10=].lastName.starts(with: searchStr)}
您也可以将其作为函数添加到您的 class
func isMatch(_ searchString: String) -> Bool {
return firstName.starts(with: searchString) || lastName.starts(with: searchString)
}
然后过滤
let filteredName = contactArray.filter {[=12=].isMatch(searchStr)}