Я с трудом пытаюсь отобразить / скрыть свои ячейки коллекций в зависимости от дочерних узлов элементов в базе данных реального времени 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, которую я могу распечатать какой сегмент был выбран. Но здесь возникают проблемы. Я попытался создать новые массивы, чтобы разделить элементы так, чтобы элементы находились в массиве в зависимости от их дочерних узлов «logi c». Однако я не могу создать массивы типа Product, чтобы я мог использовать их для повторного заполнения коллекции. Кроме того, я не совсем уверен, каким будет лучший способ хранения части logi c в моей базе данных.