Фильтрация контактов Возвращает смешанную контактную информацию - Swift - PullRequest
0 голосов
/ 20 марта 2019

Я новый разработчик 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? Или способ использовать метод предикатов для поиска при вводе?

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

1 Ответ

0 голосов
/ 20 марта 2019

В cellForRow при совершении ошибки я не изменил ссылку на 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
}
...