Почему я не могу искать имена и фамилии с помощью searchBar? - PullRequest
0 голосов
/ 30 октября 2019

Я реализовал код для searchBar, и он работает, если я ищу имя или фамилию человека. Например, если я хочу найти Кейт Белл, поиск работает, если я пишу «Кейт», и он работает, если я пишу «Белл». Но если я напишу «Кейт Б», результат поиска исчезнет.

Вот мой код:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchText.count == 0 {
        isFiltered = false
        tableViewOutlet.reloadData()
    }else {
        isFiltered = true

        searchInternalArray = contactsInternalArray.filter({ object -> Bool in
            guard let text = searchBar.text else {return false}
            return object.firstName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)) || object.lastName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines))
        })

        searchArrayGroups = sectionsArrayGroups.filter({ object -> Bool in
            guard let text = searchBar.text else {return false}
            return object.firstName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)) || object.lastName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines))
        })

        searchArraySAEs = sectionsArraySAEs.filter ({ object -> Bool in
            guard let text = searchBar.text else {return false}
            return object.firstName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)) || object.lastName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines))
        })


    tableView.reloadData()
}

Мне это нравится SO Как искать по имени и фамилии

Он находится вobjective-c и у меня проблемы с его внедрением в мой собственный код. Я попробовал что-то вроде этого:

searchInternalArray = contactsInternalArray.filter({ object -> Bool in
    guard let text = searchBar.text?.range(of: object.firstName + object.lastName) else {return false}
    return object.firstName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)) || object.lastName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines))
})

Это, очевидно, не так, как это должно быть реализовано, хотя.

Редактировать Не думаю, что это былоуместно, но, возможно, это так: я фильтрую несколько arrays, поскольку у меня есть данные, поступающие из трех разных источников в tableView. Весь код searchBar выглядит как выше. Это обновлено.

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Если я что-то упустил, есть гораздо более простое решение:

let name = firstname.lowercased() + " " + lastname.lowercased()
return name.contains(text.lowercased())

Это работает для любой части имени, фамилии или части двух с пробелом между ними. Вам, вероятно, все еще следует обрезать начальные / конечные пробелы, и если вы хотите избавиться от проблем с переменными пробелами между именами и фамилиями, вы можете искать / заменять их двойными пробелами с одним пробелом.

1 голос
/ 30 октября 2019

Почему бы просто не создать полное имя из двух частей и выполнить поиск на основе этого.

let searchResults = contactsInternalArray.filter { object in
    "\(object.firstName) \(object.lastName)".contains(searchText)
}

Вы можете по-прежнему использовать их в нижнем регистре и обрезать, если хотите.

...