Панель поиска не обновляет поиск при изменении строки поиска - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь реализовать панель поиска для поиска элементов коллекции по имени элемента.

Это мой код:

    var filtrados = false

  func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {



      if searchBar.text == nil || searchBar.text == "" {
          filtrados = false
          marcasCV.reloadData()
      }
      else {

          filtrados = true
          let buscado = searchBar.text!.lowercased()
        print(marcas)
          marcas = marcas.filter {marcas in
                           return (marcas.nombre.lowercased().contains(buscado)   )
          }

         marcasCV.reloadData()
      }

  }

  func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
       filtrados = false
       marcasCV.reloadData()


  }

Это делает поиск и фильтрует искомый items.

Моя проблема в том, что если я удалил некоторые символы поиска или нажал кнопку отмены, поиск не будет выполнен снова, и первые найденные элементы останутся в представлении коллекции.

Ответы [ 3 ]

1 голос
/ 27 апреля 2020

Это потому, что вы перезаписываете свою переменную marcas. Вы устанавливаете фильтрованный массив на ту же самую переменную, поэтому, когда ваш текст searchBar пуст. Фильтрованный массив будет пустым, как и ваша переменная marcas. То, что вам нужно сделать, это создать две переменные: т.е.

var marcas = [YourStruct]()
var marcasFiltradas = [YourStruct]()

Итак, вы бы изменили свою строку фильтрации следующим образом:

marcasFiltradas = marcas.filter {$0.nombre.lowercased().contains(searchText.lowercased()}

И вы бы изменили свои методы collectionView на что-то вроде это:

extension YourViewController: UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        filtrados ? marcasFiltradas.count : marcas.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
        let marca = filtrados ? marcasFiltradas[indexPath.row] : marcas[indexPath.row]
        // your code
        return cell
    }
}
1 голос
/ 26 апреля 2020
  func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
          marcas = searchText.isEmpty ? marcasFiltradas : marcasFiltradas.filter({(marcasName: Marcas) -> Bool in
          // If dataItem matches the searchText, return true to include it
            return marcasName.name?.range(of: searchText, options: .caseInsensitive) != nil
         })

         marcasCV.reloadData()
     }

     func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
         searchBar.text = ""

         marcas = marcasFiltradas

         searchBar.endEditing(true)

         marcasCV.reloadData()
     }
0 голосов
/ 26 апреля 2020

Нет необходимости выполнять проверку панели поиска в методе делегата панели поиска didchangetext, обычно я создаю функциональность внутри делегата collectionView, если панель поиска равна нулю, затем перезагрузите основной массив, если нет, то заполните новый массив с исходным массивом, содержащим текст панели поиска, вам нужно только реализовать внутри didchangetext метод перезагрузки collectionView. Скоро предоставит вам код.

...