Swift 4.2 Поиск контактов с помощью панели поиска с использованием Contacts Framework - PullRequest
0 голосов
/ 09 сентября 2018

В настоящее время я работаю над приложением «Контакт», чтобы протестировать некоторые функции, и застрял в строке поиска.Я не могу искать между всеми моими контактами на главной странице.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)
}

Как я могусделать это searchBar просмотреть мои контакты, используя в качестве ключа имя или фамилию.

Вот одна из моих попыток, но я получаю сообщение об ошибке с 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 Ответ

0 голосов
/ 09 сентября 2018

Ваш массив contactList содержит CNContact экземпляров. Таким образом, $0 в вашем filter - это CNContact. contains терпит неудачу, потому что 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
}
...