代码之家  ›  专栏  ›  技术社区  ›  traiantomescu

Swift 4.2使用联系人框架通过搜索栏搜索联系人

  •  0
  • traiantomescu  · 技术社区  · 7 年前

    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()
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  6
  •   rmaddy    7 年前

    contactList 数组包含 CNContact 实例。所以 $0 在你的 filter 是一个 CNC联系人 . contains 失败的原因 CNC联系人 没有 包含 方法。

    CNC联系人 变量,您希望查看联系人的姓名是否包含搜索文本。

    你可能不想 包含

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

    filteredData = contactList.filter {
        $0.givenName.range(of: searchBar.text!, options: [.caseInsensitive, .diacriticInsensitive ]) != nil ||
        $0.familyName.range(of: searchBar.text!, options: [.caseInsensitive, .diacriticInsensitive ]) != nil
    }