web-dev-qa-db-fra.com

Comment peupler deux sections d'une table avec deux tableaux différents à l'aide de swift?

J'ai deux tableaux Data1 et Data2 et je veux remplir les données dans chacun de ceux-ci (ils contiennent des chaînes) dans une vue de table en deux sections différentes. La première section devrait avoir un en-tête "Quelques données 1" et la deuxième section devrait être intitulée "KickAss".

J'ai les deux sections remplies avec les données du premier tableau (mais sans en-têtes non plus).

Voici mon code jusqu'à présent:

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 2
    }

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        var rowCount = 0
        if section == 0 {
            rowCount = Data1.count
        }
        if section == 1 {
            rowCount = Data2.count
        }
        return rowCount
    }
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
        let ip = indexPath
        cell.textLabel?.text = Data1[ip.row] as String
        return cell
    }

dans la méthode cellForRowAtIndexPath, est-il possible d'identifier la section de la même manière que dans la méthode numberOfRowsInSection? Aussi, comment puis-je donner des titres à chaque section? Merci

29
Woody

Cellules TableView

Vous pouvez utiliser un tableau multidimensionnel. Par exemple:

let data = [["0,0", "0,1", "0,2"], ["1,0", "1,1", "1,2"]]

Pour le nombre de sections, utilisez:

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return data.count
}

Ensuite, pour spécifier le nombre de lignes dans chaque section, utilisez:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return data[section].count
}

Enfin, vous devez configurer vos cellules:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cellText = data[indexPath.section][indexPath.row]

    //  Now do whatever you were going to do with the title.
}

En-têtes TableView

Vous pouvez à nouveau utiliser un tableau, mais avec une seule dimension cette fois-ci:

let headerTitles = ["Some Data 1", "KickAss"]

Maintenant, définissez les titres pour les sections:

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    if section < headerTitles.count {
        return headerTitles[section]
    }

    return nil
}

Le code ci-dessus vérifie s'il existe un titre pour cette section et le renvoie, sinon nil est renvoyé. Il n'y aura pas de titre si le nombre de titres dans headerTitles est inférieur au nombre de tableaux dans data.

le résultat

enter image description here

66
ABakerSmith

Vous pouvez créer un Struct contenant les données appartenant à une section, comme alternative à ma réponse précédente. Par exemple:

struct SectionData {
    let title: String
    let data : [String]

    var numberOfItems: Int {
        return data.count
    }

    subscript(index: Int) -> String {
        return data[index]
    }
}

extension SectionData {
    //  Putting a new init method here means we can
    //  keep the original, memberwise initaliser.
    init(title: String, data: String...) {
        self.title = title
        self.data  = data
    }
}

Maintenant, dans votre contrôleur de vue, vous pouvez configurer vos données de section de la manière suivante:

lazy var mySections: [SectionData] = {
    let section1 = SectionData(title: "Some Data 1", data: "0, 1", "0, 2", "0, 3")
    let section2 = SectionData(title: "KickAss", data: "1, 0", "1, 1", "1, 2")

    return [section1, section2]
}()

en-têtes de section

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return mySections.count
}

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return mySections[section].title
}

Par rapport à ma réponse précédente, vous n'avez plus à vous soucier de faire correspondre le nombre de headerTitles au nombre de tableaux de data.

Cellules TableView

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return mySections[section].numberOfItems
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cellTitle = mySections[indexPath.section][indexPath.row]

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
    cell.textLabel?.text = cellTitle

    return cell
}
23
ABakerSmith

Vous pouvez déterminer la section dans laquelle vous vous trouvez en regardant indexPath.section. Pour spécifier les titres, remplacez la fonction

func tableView(tableView: UITableView!, titleForHeaderInSection section: Int) -> String!
14
Glorfindel