Быстрое сегментированное управление показывает / скрывает ячейки в uicollectionview в зависимости от логики Firebase

Я с трудом пытаюсь отобразить / скрыть свои ячейки коллекции в зависимости от дочерних узлов элементов в базе данных реального времени FB. Проблема состоит из трех частей: базы данных FB, представления коллекции и сегментированного элемента управления. Моя цель - показать разные ячейки в виде коллекции в зависимости от того, есть ли у элемента дочерний элемент с определенным строковым значением.

Моя база данных выглядит так:

Items
   category1
      item1
         name: item1
         imageUrl: item1Url
         logic
            one
            three
      item2
         name: item1
         imageUrl: item1Url
         logic
            two
            three
   category2
      item1
         name: item1
         imageUrl: item1Url
         logic
            two
            four
      item2
         name: item1
         imageUrl: item1Url
         logic
            one
            two

У меня также есть собственный класс Product для отображения моих товаров в их ячейках:

class Product {
    var category: String?
    var name: String?
    var imageUrl: String?

    init(rawData: [String: AnyObject]) {
        name = rawData["name"] as? String
        imageUrl = rawData["imageUrl"] as? String
        category = rawData["category"] as? String
    }
} 

Я загружаю свои вещи из базы данных Firebase с помощью этой функции:

func loadCategoryName() {
    ref = Database.database().reference().child("Items").child(selectedCategoryFromPreviousVC)
    ref.observeSingleEvent(of: .value) { (snapshot) in
        if let data = snapshot.value as? [String: AnyObject] {
            self.itemArray = []
            let rawValues = Array(data.values)
            for item in rawValues {
                let product = Product(rawData: item as! [String: AnyObject])
                product.category = self.selectedCategoryFromPreviousVC
                self.itemArray.append(product)
            }

            // Sort item array by rating; if rating is same, sort by name
            self.itemArray.sort { (s1, s2) -> Bool in
                if s1.rating == s2.rating {
                    return s1.name! < s2.name!
                } else {
                    return s1.rating > s2.rating
                }
            }
            self.collectionView?.reloadData()
        }
    }
}

Мой itemArray теперь содержит все мои товары в качестве пользовательских продуктов, и я могу отображать их в своей ячейке.

Мой сегментированный контроль:

func someFunc() {
    let segmentController = UISegmentedControl(items: ["one", "two", "three", "four"])

    segmentController.selectedSegmentIndex = 0
    self.navigationItem.titleView = segmentController
    segmentController.addTarget(self, action: #selector(handleSegment), for: .valueChanged)
}

@objc fileprivate func handleSegment() {
    print(segmentController.selectedSegmentIndex)
}

с помощью функции handleSegment я могу распечатать какой сегмент был выбран. Но здесь возникают проблемы. Я попытался создать новые массивы, чтобы разделить элементы так, чтобы элементы находились в массиве в зависимости от их «логических» дочерних узлов. Однако я не могу создать массивы типа Product, чтобы я мог использовать их для повторного заполнения коллекции. Также я не совсем уверен, каким будет лучший способ хранения логической части в моей базе данных.

Всего 1 ответ


расширить класс продукта:

class Product {
   ...
   let logic: [String]?

   init(...) {
      ...
      logic = rawData["logic"] as? [String]
   }
}

В свой CollectionViewDataSource добавьте некоторые переменные для хранения текущего состояния

var products: [Products]
var filteredProducts: [Product]
var currentFilter: String? {
   didSet {
      guard let currentFilter = currentFilter else {
         filteredProducts = products
         return
      }
      filteredProducts = products.filter { product in
         return product.logic.contains(currentFilter)
      }
   }
}

расширить функцию handleSegment:

@objc fileprivate func handleSegment() {
   print(segmentController.selectedSegmentIndex)
   currentFilter = segmentController.titleForSegment(at: segmentController.selectedSegmentIndex)
   collectionView.reloadData()
}

В вашем источнике данных collectionView используйте фильтрованные продукты для построения ячеек.


Есть идеи?

10000