Заставить SearchBar быстро получать точные данные - PullRequest
0 голосов
/ 27 сентября 2019

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

Я использую Cloud Firestore в качестве своей базы данных, но я не думаю, что это является причиной того, почему мой поиск публикует тот же элемент, что и результат поиска.

  import Foundation
  import UIKit

  class ProductList {
      var id: String
      var name: String
      var dispensaryName: String
      var brand: String
      var category: String
      var strain: String
      var cbd: String
      var thc: String
      var imageUrl: String

      init(id: String,
           name: String,
           dispensaryName: String,
           brand: String,
           category: String,
           thc: String,
           cbd: String,
           strain: String,
           imageUrl: String) {

          self.id = id
          self.name = name
          self.dispensaryName = dispensaryName
          self.brand = brand
          self.category = category
          self.thc = thc
          self.cbd = cbd
          self.strain = strain
          self.imageUrl = imageUrl

     }

     convenience init(dictionary: [String : Any]) {
         let id = dictionary["id"] as? String ?? ""
         let name = dictionary["name"] as? String ?? ""
         let dispensaryName = dictionary["dispensaryName"] as? String ?? ""
         let brand = dictionary["brand"] as? String ?? ""
         let category =  dictionary["category"] as? String ?? ""
         let strain =  dictionary["strain"] as? String ?? ""
         let cbd =  dictionary["cbd"] as? String ?? ""
         let thc =  dictionary["thc"] as? String ?? ""
         let imageUrl =  dictionary["imageUrl"] as? String ?? ""

         self.init(id: id,
                   name: name,
                   dispensaryName: dispensaryName,
                   brand: brand,
                   category: category,
                   thc: thc,
                   cbd: cbd,
                   strain: strain,
                   imageUrl: imageUrl)
     }

  }

  import UIKit
  import SDWebImage

 class ProductListCell: UITableViewCell {

     @IBOutlet weak var productImage: UIImageView!
     @IBOutlet weak var dispensaryName: UILabel!
     @IBOutlet weak var productName: UILabel!
     @IBOutlet weak var thcPercent: UILabel!
     @IBOutlet weak var cbdPercent: UILabel!
     @IBOutlet weak var categoryLabel: UILabel!
     @IBOutlet weak var categoryStrain: UILabel!

     func configure(withProduct product: ProductList) {
         productName.text = "\(String(describing: product.brand)): \(String(describing: product.name))"
         dispensaryName.text = product.dispensaryName
         categoryLabel.text = product.category
         productImage.sd_setImage(with: URL(string: product.imageUrl))
        cbdPercent.text = product.cbd
          thcPercent.text = product.thc
          categoryStrain.text = product.strain
  }

  import UIKit
  import Firebase
  import FirebaseFirestore

  class ProductListController: UIViewController {

      @IBOutlet weak var searchBar: UISearchBar!
      @IBOutlet weak var productListTableView: UITableView!

      var productInventory: [ProductList] = []
      var productSetup: [ProductList] = []


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

      override func viewDidLoad() {
          super.viewDidLoad()

          productListTableView.dataSource = self
          productListTableView.delegate = self
          searchBar.delegate = self

          self.productListTableView.rowHeight = UITableView.automaticDimension
          self.productListTableView.estimatedRowHeight = 363


    }
    fetchProducts { (products) in
        self.productSetup = products
        self.productListTableView.reloadData()
    }

      }
      func fetchProducts(_ completion: @escaping ([ProductList]) -> Void) {
          let ref = Firestore.firestore().collection("products")
          ref.addSnapshotListener { (snapshot, error) in
              guard error == nil, let snapshot = snapshot, !snapshot.isEmpty else {
                  return
              }
              completion(snapshot.documents.compactMap( {ProductList(dictionary: $0.data())} ))
          }
      }


  }

  extension ProductListController: UITableViewDelegate, UITableViewDataSource {
      func numberOfSections(in tableView: UITableView) -> Int {
          return 1
      }
      func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

          if searchBar.text != "" {
              return self.productInventory.count
          }
          return productSetup.count
      }

      func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
          guard let cell = tableView.dequeueReusableCell(withIdentifier: "ProductListCell") as?
        ProductListCell else { return UITableViewCell() }

          //search not empty
          if searchBar.text != "" {
              cell.configure(withProduct: productInventory[indexPath.row])
          }

          cell.configure(withProduct: productSetup[indexPath.row])

          return cell
      }

  }


  extension ProductListController : UISearchBarDelegate
  {
      func searchBar(_ searchBar: UISearchBar, textDidChange    searchText: String) {
          productInventory = self.productSetup.filter({ (products) -> Bool in
              return products.name.lowercased().range(of: searchText.lowercased()) != nil
          })

          self.productListTableView.reloadData()
      }

      func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
          searchBar.resignFirstResponder()
      }
  }

Я просмотрел несколько вопросов в стеке и похоже, что ответы, которые я получаю, не сильно помогают.Надеюсь, кто-то здесь может помочь мне разобраться в этом и решить мою проблему.

1 Ответ

0 голосов
/ 27 сентября 2019

Я думаю, что проблема в cellForRowAt: - Попробуйте это

func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

      guard let cell = tableView.dequeueReusableCell(withIdentifier: "ProductListCell") as?
    ProductListCell else { return UITableViewCell() }

      //search not empty
      if searchBar.text != "" {
          cell.configure(withProduct: productInventory[indexPath.row])
      }else{

         cell.configure(withProduct: productSetup[indexPath.row])
      }



      return cell
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...