简体   繁体   中英

How do I make my CollectionView Cells filter data from my TableView?

I'm having an issue trying to get my collection view to filter data in the tableview for the category(s) set in the collection view. My goal is to have a category selected in the collection view presents the search results for the selected category in tableview shown from the category shown in the categoryLabel:

the tableview is already connected to the search bar and presents the search results accurately. But I want it to do the same for the selections/category(s) in the collection view to filter out the result selected to present the search results for that specific category in the collection view.

My data is stored in the Cloud Firestore

  import Foundation
  import UIKit

  class Category {
      var categoryLabel: String

      init(categoryLabel: String) {

          self.categoryLabel = categoryLabel

      }

      class func createCategoryArray() -> [Category] {

          var categorys: [Category] = []

          let category1 = Category(categoryLabel: "All")
          let category2 = Category(categoryLabel: "Flower")
          let category3 = Category(categoryLabel: "CBD")
          let category4 = Category(categoryLabel: "Pre-Roll")
          let category5 = Category(categoryLabel: "Pens")
          let category6 = Category(categoryLabel: "Cartridges")
          let category7 = Category(categoryLabel: "Concentrate")
          let category8 = Category(categoryLabel: "Edible")
          let category9 = Category(categoryLabel: "Drinks")
          let category10 = Category(categoryLabel: "Tinctures")
          let category11 = Category(categoryLabel: "Topical")
          let category12 = Category(categoryLabel: "Gear")

          categorys.append(category1)
          categorys.append(category2)
          categorys.append(category3)
          categorys.append(category4)
          categorys.append(category5)
          categorys.append(category6)
          categorys.append(category7)
          categorys.append(category8)
          categorys.append(category9)
          categorys.append(category10)
          categorys.append(category11)
          categorys.append(category12)

          return categorys

      }
  }

  import UIKit

  class CategoryScrollCell: UICollectionViewCell {

      @IBOutlet weak var categoryScroll: UILabel!
      @IBOutlet weak var view: UIView!

      func setCategory(category: Category) {
          categoryScroll.text = category.categoryLabel
      }
  }

  import UIKit
  import Firebase

  class ProductListController: UIViewController {


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

      var categorys: [Category] = []
      var searchActive : Bool = false
      var productInventory: [ProductList] = []
      var productSetup: [ProductList] = []


      override func viewDidLoad() {
          super.viewDidLoad()

          categorys = Category.createCategoryArray()

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

          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 {

          return productSetup.count
     }

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

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

          return cell
      }

   }

   extension ProductListController: UICollectionViewDelegate, UICollectionViewDataSource{

      func numberOfSections(in collectionView: UICollectionView) -> Int {
          return 1
      }
      func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

          return categorys.count
      }

      func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
          let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CategoryScrollCell", for: indexPath) as! CategoryScrollCell
          let category = categorys[indexPath.row]

          cell.setCategory(category: category)

          return cell
      }

      func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
             print("selected")
             self.productSetup.category = self.productInventory[indexPath.row]
      }
  }

As I understand your question,

First, here is my suggestion:

  • Don't use the UITableView and UICollectionView. No need to use two UI scroll classes together. You can achieve it using only UICollectionView.
  • Simply make a collectionView cell for category filter listing and returning it on the 0th index.

Now come to your problem, simply you can use the number of sections in CollectionView to show products with each filtered category.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM