2010-03-15 6 views
1

J'ai un UITableView groupé qui a 3 sections et un nombre de cellules dans chaque section qui doivent chacune être une cellule personnalisée différente, avec des exigences d'affichage différentes.Quelle est la meilleure façon de renvoyer des cellules différentes selon la position dans un UITableView

J'ai actuellement une grande instruction if dans cellForRowAtIndexPath, chaque branche instanciant et renvoyant la cellule personnalisée appropriée en interrogeant les propriétés de section et de ligne de l'indexPath. par exemple.

if (indexPath.section == 0 && indexPath.row == 0) { 
    // instantiate and return cell A 
} else if (indexPath.section == 1 && indexPath.row == 2) { 
    // instantiate and return cell B 
} //etc etc 

Quelle est la meilleure pratique pour ce scénario? Une grande déclaration if fait le travail, mais est-ce la meilleure implémentation?

Répondre

1

De loin, la meilleure façon de le faire est décrite dans ce message de Cocoa With Love. Fondamentalement, il s'agit d'un contrôleur personnalisé pour chaque type de cellule, mais il finit par être très simple à mettre en œuvre.

+0

Merci pour le lien, super article de blog. J'aime la façon dont toute la logique de gestion de cellule est dans un contrôleur surclassé - signifie que les contrôleurs de vue de table spécifiques sont uniquement responsables de la construction de la structure de la table. J'ai encore quelques problèmes avec la façon de gérer l'état de FirstResponder dans le contexte d'une cellule - surtout quand les taps se produisent en dehors de la cellule actuelle. Je travaille actuellement à travers ça. –

0

Je pense que c'est une pratique assez courante. Assurez-vous simplement que vous spécifiez un identifiant de cellule unique pour ces différentes cellules. Alors que la mise en cache des cellules fonctionne correctement.

1

Une méthode que je l'ai utilisé une ou deux fois est une série d'objets imbriqués NSArray que j'initialiser dans viewDidLoad:

// sec<n>Row<n>Cell are IB Outlets to UITableViewCell objects defined in your .xib 
NSArray *firstSectionRows = [[NSArray alloc] initWithObjects: sec1row1Cell, sec1row2cell, nil]; 
NSArray *secondSectionRows = [[NSArray alloc] initWithObjects: sec2row1Cell, sec2row2cell, nil]; 

// cellTree is an instance variable 
cellTree = [[NSArray alloc] initWithObjects: firstSectionRows, secondSectionRows, nil]; 
[firstSectionRows release]; 
[secondSectionRows release]; 

Ensuite, dans votre méthode tableView:cellForRowAtIndexPath: ressemblerait à ceci:

... 
return [[cellTree objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; 
... 

Cela suppose que chacune de vos cellules est unique, auquel cas vous n'avez même pas besoin d'essayer de déquiler les cellules réutilisables. Si vous avez plusieurs cellules de même type dans une section, vous devrez les créer/les supprimer de façon appropriée et leur attribuer un identifiant de type de cellule unique. Si vous avez une structure volumineuse ou compliquée, vous pourrez peut-être faire la configuration de votre tableau dans un fichier .plist et utiliser la méthode initWithContentsOfFile: de NSArray pour la lire. Cependant, vous devrez faire une sorte de magie KVC pour obtenir la cellule objets à partir des chaînes dans votre tableau:

return [self valueForKey:[[cellTree objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]]; 
1

sur les vues de table complexes que j'ai division considéré les UITableViewDataSource des routines en sous-délégués, un délégué pour chaque section. Donc, pour 3 sections, je voudrais créer 3 objets distincts chacun responsable de fournir les méthodes UITableViewDataSource pour cette section de la table. Ensuite, le délégué de UITableView envoie simplement à l'un des sous-délégués appropriés en fonction de la section pour laquelle la demande est faite.

Questions connexes