web-dev-qa-db-fra.com

iPhone - Que sont reuseIdentifier (UITableViewCell)?

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 avec l'intention de le réutiliser comme base (pour des raisons de performances) pour plusieurs lignes d'une vue de table. Il est affecté à l'objet cellule dans initWithFrame: reuseIdentifier: et ne peut pas être modifié par la suite. Un objet UITableView gère une file d'attente (ou une 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 UITableViewCells et essayez d'en réutiliser autant que vous le pouvez 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 (enfin je suppose qu'elles ne sont pas entièrement identiques), peuvent-elles avoir toutes les deux le même identifiant? Ou devraient-ils en avoir des différents? Ou dans quelle situation êtes-vous censé utiliser différents identifiants?

Quelqu'un peut-il clarifier ou établir un lien vers un endroit où il se trouve?

50
quano

Ok, voici comment je pense que cela fonctionne:

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

Vous pouvez l'essayer vous-même en faisant ceci:

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 ne souhaitez que dequeueReusableCellWithIdentifier pour renvoyer une cellule que si elle est applicable. Donc, si une cellule va être réutilisée, assurez-vous qu'elle est adaptée à la situation. C'est à cela que servent les réutilisateurs. Habituellement, vous n'en aurez besoin que d'un. Mais il peut y avoir une liste qui utilise plusieurs types de cellules différents, et dans ce cas, vous devez les conserver séparément en fournissant différents identificateurs de réutilisation. Sinon, vous pourriez finir par 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, fondamentalement, si je comprends bien, utilisez différents reuseIdentifiers pour différents types de cellules, où genre signifie classe. Si vous n'utilisez que des cellules standard, vous n'aurez probablement besoin que d'un seul reuseIdentifier.

Ce modèle de conception est appelé regroupement d'objets .

66
quano

Juste pour ajouter des choses à 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 tabulaire de 6 à 7 cellules et que chacune est différente, vous pouvez trouver que la création d'une nouvelle cellule avec zéro comme identifiant peut être préférable.

Le fait d'avoir une cellule réutilisable signifie qu'à chaque appel de cellForRowAtIndexPath, 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 init, vous devez explicitement parcourir tous les chemins d'index possibles et définir les valeurs pour chaque étiquette en fonction du type de cellule que vous possédez! Ainsi, dans une vue de table avec 10 cellules dinstinctes, vous devrez prendre soin 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 de code d'initialiser chaque cellule avec un identifiant nul (car il ne sera pas réutilisé de toute façon) et de remplir correctement les informations de chaque cellule sans se soucier de les réutiliser.

10
csotiriou

UITableView est comme avoir un pool de cellules pour chaque reuseIdentifier, afin de recycler 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

2
onmyway133