50 votes

iPhone - Que sont les reuseIdentifiers (UITableViewCell) ?

Extrait de la documentation officielle :

L'identifiant de réutilisation est associé à un objet UITableViewCell que le délégué de la vue de table crée dans l'intention de le réutiliser comme base (pour des raisons de performance) pour plusieurs lignes d'une vue de table. Il est attribué à l'objet cell dans initWithFrame:reuseIdentifier : et ne peut plus être modifié par la suite. Un objet UITableView maintient une file d'attente (ou liste) des cellules actuellement réutilisables, chacune avec son propre identifiant de réutilisation, et les met à la disposition du délégué dans la méthode dequeueReusableCellWithIdentifier :.

http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITableViewCell_Class/Reference/Reference.html#//apple_ref/occ/instp/UITableViewCell/reuseIdentifier

Je ne comprends pas ça. Eh bien, je comprends l'idée de base, je pense, que vous créez des UITableViewCells, et que vous essayez d'en réutiliser autant que possible au lieu d'en créer de nouvelles (ou quelque chose comme ça). Mais qu'est-ce qui décide exactement si une cellule est réutilisable ou non ? Si j'ai deux cellules identiques (visuellement), mais avec des textes différents (je suppose qu'elles ne sont pas entièrement identiques), peuvent-elles avoir le même identifiant ? Ou doivent-elles en avoir des différents ? Ou dans quelle situation est-on censé utiliser des identifiants différents ?

Quelqu'un peut-il apporter des éclaircissements ou indiquer un lien vers un endroit où cela est possible ?

66voto

quano Points 5084

Ok, voilà comment je crois que ça marche :

En utilisant dequeueReusableCellWithIdentifier pour le tableView, vous pouvez accélérer considérablement les choses. Au lieu d'instancier un grand nombre de cellules, vous n'en instanciez que le nombre nécessaire, c'est-à-dire le nombre de cellules visibles (ce qui est géré automatiquement). Si vous faites défiler la liste vers une zone où se trouvent des "cellules" qui n'ont pas encore de représentation visuelle, au lieu d'en instancier de nouvelles, vous réutilisez celles qui existent déjà.

Vous pouvez essayer vous-même en procédant comme suit :

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil)
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    NSLog(@"new one");
}
else
{
    NSLog(@"old one");
}

N'oubliez pas que vous voulez que dequeueReusableCellWithIdentifier renvoie une cellule uniquement si elle est applicable. Donc, si une cellule doit être réutilisée, assurez-vous qu'elle est adaptée à la situation. C'est à cela que servent les reuseIdentifiers. En général, vous n'en aurez besoin que d'un seul. Mais il pourrait y avoir une liste qui utilise plusieurs types différents de cellules, et dans ce cas, vous devriez les séparer en fournissant différents reuseIdentifiers. Sinon, vous risquez d'obtenir une cellule que vous traitez comme un autre type de cellule (par exemple, une cellule UITableView au lieu de la cellule personnalisée que vous vouliez).

Donc, en gros, si je comprends bien, utilisez différents reuseIdentifiers pour différents types de cellules, où kind signifie classe. Si vous n'utilisez que des cellules standard, vous n'avez probablement besoin que d'un seul ReuseIdentifier.

Ce modèle de conception est connu sous le nom de regroupement d'objets .

10voto

csotiriou Points 1549

Juste pour ajouter quelques éléments à la très bonne réponse de Quano : (J'ai essayé d'ajouter ceci en tant que commentaire, mais c'était trop long !)

Même les identifiants de réutilisation peuvent être omis dans le développement, bien que cela doive être fait dans des circonstances très spécifiques. Si vous avez une vue de tableau de 6-7 cellules, et que chacune est différente, vous pouvez trouver que la création d'une nouvelle cellule avec nil comme identifiant est préférable.

Avoir une cellule réutilisable signifie qu'à chaque fois que le cellForRowAtIndexPath est appelé, vous devez vérifier la cellule, l'initialiser s'il n'y a pas de cellule réutilisable, et en dehors de la portée de l'init, vous devez explicitement itérer à travers tous les indexpaths possibles et définir les valeurs pour chaque étiquette explicitement en fonction du type de cellule que vous avez ! Ainsi, dans une vue tableau avec 10 cellules distinctes, vous devrez vous occuper de créer la cellule si elle est nulle, et de la remplir en fonction de ce que vous avez créé.

Par conséquent, dans ce cas, il est préférable en termes de maintenance du code d'initialiser chaque cellule avec un identifiant nul (puisqu'il ne sera pas réutilisé de toute façon) et de remplir les informations de chaque cellule de manière appropriée sans se soucier de leur réutilisation.

2voto

onmyway133 Points 2196

UITableView, c'est comme avoir un pool de cellules pour chaque reuseIdentifier pour qu'il recycle la cellule

J'aime cette vidéo de http://oleb.net/blog/2014/05/scrollviews-inside-scrollviews/

http://im.ezgif.com/tmp/ezgif-3302899694.gif

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X