Панель поиска отображается правильно, но при нажатии неправильно - PullRequest
0 голосов
/ 10 сентября 2018

Я добавил панель поиска в свое приложение «Контакт», но после поиска имени или фамилии возвращается правильный контакт. Но на прессе возвращается неправильный контакт. Вот мой код:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    let store = CNContactStore()
    store.requestAccess(for: .contacts, completionHandler: { (success, error) in
        if success {
            let keys = CNContactViewController.descriptorForRequiredKeys()
            let request = CNContactFetchRequest(keysToFetch: [keys])

            request.sortOrder = CNContactSortOrder.givenName

            do {
                self.contactList = []
                try store.enumerateContacts(with: request, usingBlock: { (contact, status) in
                    self.contactList.append(contact)
                })
            } catch {
                print("Error")
            }
            OperationQueue.main.addOperation({
            self.tableView.reloadData()
            })
        }
    })
}

И это моя функция для панели поиска:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchBar.text == nil || searchBar.text == "" {
        inSearchMode = false
        view.endEditing(true)
        self.tableView.reloadData()
    } else{
       inSearchMode = true
       filteredData = contactList.filter {
            $0.givenName.range(of: searchBar.text!, options: [.caseInsensitive, .diacriticInsensitive ]) != nil ||
            $0.familyName.range(of: searchBar.text!, options: [.caseInsensitive, .diacriticInsensitive ]) != nil
        }
       self.tableView.reloadData()
    }
}

UPDATE:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let contact = contactList[indexPath.row]
    let controller = CNContactViewController(for: contact)
    navigationController?.pushViewController(controller, animated: true)
}

1 Ответ

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

Как указано в моем комментарии выше, вы выбираете элемент из списка контактов (или полного списка контактов), но в режиме поиска индексы явно не совпадают.

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

Может быть что-то вроде:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    var contact: CNContact

    if inSearchMode {
        contact = filteredData[indexPath.row]
    } else {
        contact = contactList[indexPath.row]
    }

    let controller = CNContactViewController(for: contact)
    navigationController?.pushViewController(controller, animated: true)
}
...