web-dev-qa-db-fra.com

Remplir TableView avec plusieurs sections et plusieurs dictionnaires dans un tableau dans Swift

J'ai une catégorie 3 que j'utilisais comme section. Dans cette section, je dois remplir des données qui sont dans un tableau de dictionnaire. Voici mon code: -

var sections = [Category A, Category B, Category C]
var itemsA = [["Item": "item A","ItemId" : "1"],["Item": "item B","ItemId" : "2"],["Item": "item C","ItemId" : "3"]]
var itemsB = [["Item": "item A","ItemId" : "1"],["Item": "item B","ItemId" : "2"],["Item": "item C","ItemId" : "3"]]
var itemsC = [["Item": "item A","ItemId" : "1"],["Item": "item B","ItemId" : "2"],["Item": "item C","ItemId" : "3"]]

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

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return self.sections[section]
}

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

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

Le tableau d'éléments dont j'ai besoin pour être renseigné dans la catégorie de table. Si quelqu'un peut répondre. Je vous remercie!

8

Si le tableau itemA pour la catégorie A, le tableau itemB pour la catégorie B et ainsi de suite, vous pouvez renvoyer le nombre de tableaux dans numberOfRowsInSection de cette façon.

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    switch (section) {
        case 0: 
           return itemsA.count
        case 1: 
           return itemsB.count
        default: 
           return itemsC.count
     }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "StoreCell") as! UITableViewCell
    switch (indexPath.section) {
        case 0: 
           //Access itemsA[indexPath.row]
        case 1: 
           //Access itemsB[indexPath.row]
        default: 
           //Access itemsC[indexPath.row]
     }
     return cell
}

Note: C'est de la pâte si vous créez un seul tableau de struct ou une classe personnalisée qui réduira tout votre tableau avec un seul tableau.

15
Nirav D

Utiliser une structure personnalisée

struct Category {
   let name : String
   var items : [[String:Any]]
}

var sections = [Category]()

let itemsA = [["Item": "item A","ItemId" : "1"],["Item": "item B","ItemId" : "2"],["Item": "item C","ItemId" : "3"]]
let itemsB = [["Item": "item A","ItemId" : "1"],["Item": "item B","ItemId" : "2"],["Item": "item C","ItemId" : "3"]]
let itemsC = [["Item": "item A","ItemId" : "1"],["Item": "item B","ItemId" : "2"],["Item": "item C","ItemId" : "3"]]


sections = [Category(name:"A", items:itemsA), 
            Category(name:"B", items:itemsB), 
            Category(name:"C", items:itemsC)]

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

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return self.sections[section].name
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let items = self.sections[section].items
    return items.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "StoreCell") as! UITableViewCell
    let items = self.sections[indexPath.section].items
    let item = items[indexPath.row]
    print(item["ItemId"] as? String)

    return cell
}

Vous pouvez toujours améliorer le code si vous utilisez également une structure personnalisée pour les dictionnaires.

23
vadian