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
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
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
}
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!