Swift 4.2使用“联系人框架”搜索与搜索栏的联系人

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

我目前正在开发一个联系人应用程序,只是为了测试一些功能而且我被搜索栏困住了。我无法在主页中的所有联系人之间进行搜索。 Swift 4.2和Xcode 10

class ContactsViewController: UITableViewController, CNContactViewControllerDelegate, UISearchBarDelegate {
// Outlet for Search Bar
@IBOutlet weak var searchBar: UISearchBar!

这是我在IBOutlet上的代表的定义

然后我的功能在主页上显示联系人

/ * Show Contacts *
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if contactList != nil {
        return contactList.count
    }
    return 0
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "contactCell", for: indexPath)

    let contact: CNContact!
    contact = contactList[indexPath.row]

    cell.textLabel?.text = "\(contact.givenName) \(contact.familyName)"
    return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let contact = contactList[indexPath.row]
    let controller = CNContactViewController(for: contact)
    navigationController?.pushViewController(controller, animated: true)
}

如何使用关键名称或姓氏来搜索我的联系人。

这是我的尝试之一,但我得到contains的错误:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchBar.text == nil || searchBar.text == "" {
        inSearchMode = false

        view.endEditing(true)

        tableView.reloadData()
    } else {
        inSearchMode = true

        filteredData = contactList.filter({$0.contains(searchBar.text!)})

        tableView.reloadData()
    }
}
ios swift uisearchbar contacts
1个回答
3
投票

你的contactList数组包含CNContact实例。所以$0中的filterCNContactcontains失败,因为CNContact没有contains方法。

如果您有一个CNContact变量并且想要查看联系人姓名是否包含搜索文本,请考虑您需要编写什么。

你可能不想要contains,因为你可能想要做一个不区分大小写,变音符号的搜索。

这是一个通过查看联系人的给定和姓氏属性的示例。根据需要添加其他属性:

filteredData = contactList.filter {
    $0.givenName.range(of: searchBar.text!, options: [.caseInsensitive, .diacriticInsensitive ]) != nil ||
    $0.familyName.range(of: searchBar.text!, options: [.caseInsensitive, .diacriticInsensitive ]) != nil
}
© www.soinside.com 2019 - 2024. All rights reserved.