我是Swift的新开发人员。我已经成功地从电话中提取了联系人并将其保存在一系列联系人中,每个联系人都具有以下结构:
struct Contact {
var contactDetails:CNContact
var isFavorite:Bool
该数组称为deviceContacts。
我还设置了一个名为searchResults的联系人空数组。
我在联系人表中有一个搜索栏,我想在键入时自动过滤联系人。我可以使用搜索栏的以下代码成功完成此操作:
extension ContactsViewController: UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
searchResults = deviceContacts.filter{($0.contactDetails.familyName.prefix(searchText.count) == searchText)}
searching = true
tableView.reloadData()
// This does not work. It filters by the last name. But it keeps John as the first name, etc. It does not pull the full contact.
}
}
尽管此功能将在您键入时进行搜索,并在您键入更多字符时实时过滤结果,但结果却混杂在一起。它们显示正确的姓氏,但显示错误的姓氏。名字从列表的顶部开始。因此,例如,如果您在模拟器中的标准联系人中搜索“ Bell”,您将得到Bell,John。贝尔是列表中的第二人,约翰是列表中的第一人。
我尝试使用谓词搜索来搜索联系人,但是像此功能一样,当您实时键入内容时,我无法进行搜索。
搜索时是否有办法拉动完整联系人?还是仅提取对匹配的Contact的引用并将该Contact放入searchResults数组的方法?还是在输入时使用谓词方法进行搜索的方法?
任何帮助将不胜感激。
答案 0 :(得分:0)
在cellForRowAt中,我犯了一个错误,没有更改名字的搜索结果引用,仅更改了姓氏。这是tableView的代码:
if searching {
cell.textLabel?.text = searchResults[indexPath.row].contactDetails.familyName+", "+searchResults[indexPath.row].contactDetails.givenName
} else {
cell.textLabel?.text = deviceContacts[indexPath.row].contactDetails.familyName+", "+deviceContacts[indexPath.row].contactDetails.givenName
}