Поиск в TableView (SearchBar)


#1

Здравствуйте, подскажите пожалуйста,
задача, реализовать поиск в TableView

Я пытался вот так

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
filteredData = searchText.isEmpty ? categoryName : categoryName.filter({(dataString: String) -> Bool in
return dataString.range(of: searchText, options: .caseInsensitive) != nil
})
tableView.reloadData()
}

и вот так

func updateSearchResults(for searchController: UISearchController) {
if searchController.searchBar.text! == “” {
filteredCakes = cakes
} else {
filteredCakes = cakes.filter { $0.name.lowercased().contains(searchController.searchBar.text!.lowercased()) }
}
self.tableView.reloadData()
}

Подписался
UISearchBarDelegate, UISearchControllerDelegate, UISearchResultsUpdating …

Любой информации буду рад, спасибо.


#2

Вот туториал по серч контроллеру.
А вот без использования search controller-a.


#3

А как будет лучше сделать ? Без использования search controller-a или с search controller-ом? Как правильно? Как лучше?


#4

1 - то, что поставляется из коробки.
2 - написано самостоятельно.
Что использовать - это уже на ваше усмотрение, если не нужно чего-то большего, чем то, что поставляется из коробки - реализуйте 1 вариант, если же вам нужно как-нибудь расширять - реализуйте самостоятельно.


#5

В продолжении темы…

Поиск в приложении реализован (почти!). Проблема на данный момент одна:
Поиск по строке осуществляется целом по строке.
Правильней сделать по словам из строки.
Например, есть массив с ключевыми словами [мама, папа, дедушка, бабушка, сын, дочь, родители, мама дедушка, папа бабушка]
В поиске ввожу: “папа” - в результате мне выдаст поиск два результата “папа” и “папа бабушки”.
Если в поиске введу “мама дедушка” - в результате получу один результат “мама дедушка”. НО!!! Ожидаю другой результат: “мама дедушка”, “мама”, “дедушка”.

Как я вижу это:

  1. Строку разбиваем на слова
    stringSearch.components(separatedBy: [" ", “-”, “/”])
    На выходе получаем массив из слов.
  2. На третьем пункте осуществляем поиск по каждому слову.
    Но вот тут и возникает вопрос - перебирать массив (for in) и искать по каждому слову отдельно, или есть средства осуществления поиска по словам из строки “на лету”?

PS Пункт два пропустил намеренно, он как доп вопрос.
2. У слов есть приставки и окончания, которые меняются. Вот как с ними поступать при поиске? Обрезать слово в начале и в конце? Например, если слово больше 6 знаков, то в поисковом запросе обрезаем его сзади на 2 символа, спереди на 3-4 символа. Так?
Дополнение для пункта 2:
Можно использовать регулярные выражения, например, для запроса в БД (parse) используется “?i” (не важно в каком регистре набрано): query.whereKey(“fullname”, matchesRegex: “(?i)(searchString)”)
Вот найти регулярное выражение, чтобы игнорировать N символов вначале и в конце слова - не могу :slight_smile:


#6

Пункт 2 решил:
(searchString.substring(to: searchString.index(searchString.endIndex, offsetBy: -2)))

с конца отрезаю два символа.

Вот с поисковой строкой в которой больше одного слова - вопрос открыт.