2010-01-12 5 views
2

J'ai tout le code écrit pour diviser un NSMutableArray en sections pour un UITableView. Mais dans cellForRowAtIndexPath, je trouve que indexPath.row renvoie uniquement la ligne de la section en cours. Est-il possible de fournir simplement le numéro de la ligne pour l'UITableView entier. Si quelqu'un a besoin de voir le code je l'attacherai mais je ne pense pas qu'il soit très utile de répondre à cette question excepté si je dois utiliser un autre algorithme pour trouver le cellForRow.UITableView Problème avec les sections

Répondre

2

Eh oui, la rangée propriété du indexPath est la ligne dans la section, vous avez donc besoin de stocker un tableau de tableaux (un tableau pour chaque section). Quelque chose comme:

// an array of arrays, one for each section 
NSArray * _sectionDataArray; 

Lorsque vous vous construisez index que vous créez un tableau pour chaque section et le stocker dans le _sectionDataArray. Pour ce faire, vous devez créer un objet NSMutableDictionary, saisi par vos en-têtes de section, contenant un tableau de CellThing (un objet contenant vos données de cellule). Une fois que vous avez un dictionnaire, vous pouvez simplement saisir le tableau pour chaque lettre et le coller dans _sectionDataArray.

Dans votre cellForRowAtIndexPath méthode, vous pouvez accéder aux données de cellule en obtenant le tableau de la section comme ceci:

NSArray * sectionArray = [_sectionDataArray objectAtIndex:indexPath.section]; 

Une fois que vous avez le tableau de section, vous pouvez accéder aux données des cellules individuelles que vous êtes après à l'aide la ligne dans le indexPath:

CellThing * cellObject = [sectionArray objectAtIndex:indexPath.row]; 
+0

Ne préfixez pas vos noms de variables membres avec un caractère de soulignement. Apple a réservé le droit à ces noms! – benzado

+0

@benzado Merci Ben, je n'étais pas au courant de ça. – RedBlueThing

0

Eh bien, vous avez évidemment une façon de Knowin g combien de lignes sont supposées être pour chaque section - Vous le fournissez dans la méthode tableView: rowsInSection:

Par souci d'argument je suppose qu'il ya un nombre fixe de lignes dans chaque section, donc l'indice dans le tableau serait indexPath.section * kNumOfRowsInSection + indexPath.row

1

Si vous voulez vraiment convertir un index chemin vers un numéro de ligne absolu, vous pouvez le faire:

// Start with row offset 
int absoluteRow = indexPath.row; 
// Add count of rows from all earlier sections 
int s; 
for (s = 0; s < indexPath.section; s++) { 
    absoluteRow += [tableView numberOfRowsInSection:s]; 
} 

Mais il est sans doute préférable d'organiser vos données pour correspondre à la structure de votre table.

+0

Parce que ma structure de données est limitée par la forme du XML entrant, c'était la solution nécessaire pour moi. N'oubliez pas, cependant, que numberOfRowsInSection: est le -2nd-label dans le nom de la méthode. Devrait être [tableView.dataSource tableView: tableView numberOfRowsInSection: s]; – MikeyWard

+0

Vous aviez raison que l'appel de la méthode était incorrect, mais au lieu d'appeler la méthode de la source de données, j'appelle la méthode de la vue de la table, juste pour vous contrarier. :-) – benzado

Questions connexes