Фильтрация контактов возвращает смешанную контактную информацию — Swift

#swift #search #filter #contacts

#swift #Поиск #Фильтр #Контакты

Вопрос:

Я новый разработчик 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. Белл — второй человек в списке, а Джон — первый человек в списке.

Я пытался использовать для этого предикатный поиск контактов, но я не смог заставить его выполнять поиск при вводе в режиме реального времени, как это делает эта функция.

Есть ли способ получить полный контакт при поиске? Или способ извлечь только ссылку на соответствующий контакт и поместить этот контакт в массив SearchResults? Или способ использовать метод предиката для поиска по мере ввода?

Будем признательны за любую помощь.

Ответ №1:

В cellForRowAt я допустил ошибку и не изменил ссылку на результаты поиска для имени, только для фамилии. Вот код для представления таблицы:

 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
}