过滤联系人返回混合联系人信息 - Swift

问题描述 投票:0回答:1

我是一名新的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.

}    
}

虽然此功能将在您键入时进行搜索,并在您键入更多字符时实时过滤结果,但结果会混淆。它们显示正确的姓氏,但错误的名字。名字从名单的顶部开始。因此,例如,如果您在模拟器中搜索“贝尔”的标准联系人,您将获得贝尔,约翰。贝尔是名单上的第二人,约翰是名单上的第一人。

我尝试使用谓词搜索联系人,但是我无法像实时输入一样进行搜索。

有没有办法在搜索时拉出完整的联系人?或者只提取一个对匹配的联系人的引用并将该联系人放入searchResults数组的方法?或者在键入时使用谓词方法进行搜索的方法?

任何帮助,将不胜感激。

swift search filter contacts
1个回答
0
投票

在cellForRowAt中我犯了一个错误,并没有更改第一个名称的searchResults引用,仅用于姓氏。这是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
}
© www.soinside.com 2019 - 2024. All rights reserved.