Фильтр панели поиска Swift Done Search - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь отфильтровать свой массив в моем табличном представлении на «содержит» вместо «префикс» при поиске. Вот мой код:

    var searching = false
    var cityArray = [["NYC, NY, New Hampshire"], ["Buffalo, NY"]]
    func reloadData() { 
    tableview.reloadData()
    }

    
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    searching = true
        searchCity = cityArray.flatMap({ $0 }).filter ({ 
        $0.lowercased().contains(searchBar.text!.lowercased())})
    reloadData()
    }

Эта функция успешно это делает. Однако, когда я прекращаю редактирование в строке поиска, таблица становится пустой без значений и не возвращает предыдущий массив до начала поиска.

Моя предыдущая версия префикса позволила мне без проблем вернуть предыдущий массив:

     func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
     searching = true
     searchCity = cityArray.flatMap({ $0 }).filter { $0.lowercased().prefix(searchText.count) == 
     searchText.lowercased()}
     reloadData()
     }

Ответы [ 3 ]

0 голосов
/ 02 августа 2020

Вы должны установить searching на false, если searchText пусто.

И range(of с опцией caseInsensitive более эффективно, чем ручное lowercased преобразование

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchText.isEmpty {
        searching = false
        searchCity.removeAll()
    } else {
        searching = true
        searchCity = cityArray.flatMap({ $0 })
                              .filter{ $0.range(of: searchText, options: .caseInsensitive) != nil }

    }
    reloadData()
}
0 голосов
/ 05 августа 2020

Чтобы решить эту проблему, я использовал ответы сверху и объединил их вместе:

   func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
      if searchText.isEmpty {
        print("search Text is nil")
        searching = false
    } else {
        searching = true
        searchCity = cityArray.flatMap({ $0 }).filter ({ 
             $0.lowercased().contains( searchText.lowercased())})          
    }
    reloadData()
    }
0 голосов
/ 02 августа 2020

Вы изменили использование searchBar.text вместо searchText.

Следующее должно решить вашу проблему (не проверено):

 func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
      searching = true
    searchCity = cityArray.flatMap({ $0 }).filter ({ 
    $0.lowercased().contains(searchText.lowercased())})
    reloadData()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...