筛选联系人返回混合的联系人信息-Swift

时间:2019-03-19 21:36:13

标签: swift search filter contacts

我是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数组的方法?还是在输入时使用谓词方法进行搜索的方法?

任何帮助将不胜感激。

1 个答案:

答案 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
}