web-dev-qa-db-fra.com

Quand utiliser dequeueReusableCellWithIdentifier contre dequeueReusableCellWithIdentifier: forIndexPath

Il y a deux surcharges pour dequeueReusableCellWithIdentifier et j'essaie de déterminer quand dois-je utiliser l'un par rapport à l'autre?

Apple docs concernant les états de la fonction forIndexPath, "Cette méthode utilise le chemin de l'index pour effectuer une configuration supplémentaire en fonction de la position de la cellule dans la vue tableau."

Je ne sais pas comment interpréter cela cependant?

156
Jaja Harris

La différence la plus importante est que la version forIndexPath: s'assertie (se bloque) si vous n'avez pas enregistré de classe ou de nib pour l'identifiant. La version plus ancienne (non -forIndexPath:) renvoie nil dans ce cas.

Vous enregistrez une classe pour un identifiant en envoyant registerClass:forCellReuseIdentifier: à la vue tabulaire. Vous enregistrez un nib pour un identifiant en envoyant registerNib:forCellReuseIdentifier: à la vue Table.

Si vous créez votre vue de table et vos prototypes de cellules dans un storyboard, le chargeur de storyboard se charge de l'enregistrement des prototypes de cellules que vous avez définis dans le storyboard.

Session 200 - Quoi de neuf dans Cocoa Touch à partir de WWDC 2012 discute de la version (alors nouvelle) forIndexPath: démarrant vers 8m30s. Il est écrit que "vous obtiendrez toujours une cellule initialisée" (sans mentionner que celle-ci plantera si vous n'enregistrez pas de classe ou de grappe).

La vidéo indique également que "ce sera la bonne taille pour ce chemin d’index". Cela signifie vraisemblablement que cela va définir la taille de la cellule avant de la retourner, en regardant la largeur de la vue de table et en appelant la méthode tableView:heightForRowAtIndexPath: de votre délégué (si elle est définie). C'est pourquoi il a besoin du chemin d'index.

204
rob mayoff

dequeueReusableCellWithIdentifier:forIndexPath: retournera toujours une cellule. Il réutilise les cellules existantes ou en crée une nouvelle et retourne s’il n’ya pas de cellules.

Alors que le dequeueReusableCellWithIdentifier: traditionnel retournera une cellule s’il existe, c’est-à-dire s’il existe une cellule qui peut être réutilisée, il renvoie le cas échéant, il renvoie nil. Vous devez donc écrire une condition pour vérifier la valeur de nil.

Pour répondre à votre question, utilisez dequeueReusableCellWithIdentifier: lorsque vous souhaitez prendre en charge iOS 5 et les versions antérieures, car dequeueReusableCellWithIdentifier:forIndexPath n'est disponible que sur iOS 6+.

Référence: https://developer.Apple.com/library/ios/documentation/uikit/reference/UITableView_Class/Reference/Reference.html#//Apple_ref/occ/instm/UITableView/dequeueReusableCellWithIdentifier:forIndexPath :

36
GoodSp33d

Je n'ai jamais compris pourquoi Apple a créé la nouvelle méthode, dequeueReusableCellWithIdentifier: forIndexPath :. Leur documentation à leur sujet n'est pas complète et est quelque peu trompeuse. La seule différence que j'ai pu discerner entre les deux méthodes est que l'ancienne méthode peut renvoyer nil, si elle ne trouve pas de cellule avec l'identificateur transmis, alors que la nouvelle méthode se bloque si elle ne peut pas retourner une cellule. Il est garanti que les deux méthodes renvoient une cellule, si vous avez défini l'identificateur correctement, et créez la cellule dans un storyboard. Les deux méthodes sont également garanties pour renvoyer une cellule si vous enregistrez une classe ou un xib et créez votre cellule en code ou en fichier xib.

6
rdelmar

Pour faire court:

dequeueReusableCell(withIdentifier, for) ne fonctionne qu'avec les cellules prototypes. Si vous essayez de l'utiliser lorsque la cellule prototype est en absence, l'application se bloquera.

Hollemans M. 2016, Chapitre 2 - Liste de contrôle, Apprenti IOS (5ème édition). pp: 156.

1
SLN