Показать строку в разделе с таким же именем значения строки - PullRequest
0 голосов
/ 26 мая 2020

У меня есть структура продуктов, взятая из Firebase db, например:

struct Product {
    var name: String
    var type: String
    var ingredients: String
    var price: Double
}

, и я хочу заполнить табличное представление разделом (тип продукта) и относительными строками. Итак, я создал массив со всеми типами продуктов:

let array = product.compactMap{$0.type}

Затем я удалил дубликаты и использовал окончательный массив для numberofSection и titleForHeaderInSections, и он работает. Но теперь я хочу отображать в каждом разделе только товары с одинаковым названием раздела. Как я могу над этим поработать?

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return product.count
    }

Ответы [ 3 ]

3 голосов
/ 26 мая 2020

Вы можете сгруппировать свои продукты в словаре по типу

let dict = Dictionary(grouping: product, by: { $0.type})

, а затем получить к нему доступ, используя свой массив типов

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let type = typesArray[section]
    guard let count = dict[type]?.count else {
        return 0
    }
    return count
}

Другой вариант - создать словарь напрямую с помощью индекс массива в качестве ключа, поэтому его можно использовать непосредственно в tableView: numberOfRowsInSection

Dictionary(grouping: product, by: { typesArray.firstIndex(of: prod.type)! })
1 голос
/ 26 мая 2020

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

struct Category {
    var type: String
    var products: [Product]
}

let allProducts = [Product]()
let categorySet: Set<String> = allProducts.map({ $0.type }).toSet()

let categorys: [Category] = categorySet.map { (type) -> T in
        return Category(type: type, products: allProducts.filter({ $0.type == type}) )
 }

func numberOfSections(in tableView: UITableView) -> Int {
    return categorys.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
   return categorys[section].products.count
}


func tableView( tableView : UITableView,  titleForHeaderInSection section: Int)->String
{

return categorys[section].type

}
0 голосов
/ 26 мая 2020

Используйте filter как это:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return product.filter { $0.type == "myType" }.count
}
...