Заполните Tableview массивом словаря и разделите по разделам - PullRequest
0 голосов
/ 10 июля 2020

Как я могу заполнить tableview из массива словаря и разделить его по разделам

Я получаю данные из Firebase, и иногда это может быть null, иногда 2 или 3 элемента. Тип данных - это массив словаря [[String: Int]]. Если у него есть элемент, это может быть, например:

var selectedVariation:[["ice": 20$, "cold": 30$], ["no Choco": 0$, "with Choco": 40$]]

В этом случае я должен разделить представление таблицы в разделе без имени 2. Первый раздел должен содержать ["ice": 20 $, "cold": 30 $], а второй ["no Choco": 0 $, "with Choco": 40 $]

С кодом ниже я могу просто заполнить tableview без разделов и вручную написать numberOfRows

var selectedVariation: [[String:Int]]?  
var keysArray: [String] = []
var valueArray: [Int] = []


func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return selectedVariation?.count ?? 0
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    
    return 4
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "VariationCell", for: indexPath) as! VariationTableViewCell
    for section in selectedVariation! {
    
    for (key, value) in section.sorted(by: {$0.1 < $1.1}) {        
         keysArray.append(key)
         valueArray.append(value)
    }
 
}
cell.variationName.text = keysArray[indexPath.row]
cell.variationPrice.text = "+" + String(valueArray[indexPath.row]) 
return cell
}

И бонус будет, если я могу поставить галочку только на один элемент в каждом разделе :)

1 Ответ

0 голосов
/ 10 июля 2020

Лучшее решение - сопоставить словари с настраиваемыми структурами, но если вы хотите сохранить эту модель данных, методы источника данных табличного представления:

var selectedVariation = [["ice": 20, "cold": 30], ["no Choco": 0, "with Choco": 40]]

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

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "VariationCell", for: indexPath) as! VariationTableViewCell
    let section = selectedVariation[indexPath.section]
    let key = section.keys.sorted()[indexPath.row]
    let value = section[key]!
    cell.variationName.text = key
    cell.variationPrice.text = "+" + String(value)
    return cell
}

Примечание: func numberOfSectionsInTableView(tableView: UITableView) -> Int - это Swift 2

...