La différence la plus importante est que la forIndexPath:
version affirme (plante) si vous n'avez pas enregistré de classe ou de nib pour l'identifiant. L'ancienne forIndexPath:
version (non- ) retourne nil
dans ce cas.
Vous enregistrez une classe pour un identifiant en l'envoyant registerClass:forCellReuseIdentifier:
à la vue table. Vous enregistrez une plume pour un identifiant en l'envoyant registerNib:forCellReuseIdentifier:
à la vue de table.
Si vous créez votre vue de tableau et vos prototypes de cellule dans un storyboard, le chargeur de storyboard se charge d'enregistrer les prototypes de cellule que vous avez définis dans le storyboard.
Session 200 - Quoi de neuf dans Cocoa Touch de la WWDC 2012 discute de la (alors nouvelle) forIndexPath:
version à partir d'environ 8m30s. Il dit que "vous obtiendrez toujours une cellule initialisée" (sans mentionner qu'elle plantera si vous n'avez pas enregistré de classe ou de nib).
La vidéo dit également que "ce sera la bonne taille pour ce chemin d'index". Cela signifie probablement qu'il définira la taille de la cellule avant de la renvoyer, en regardant la largeur de la vue tableau et en appelant la tableView:heightForRowAtIndexPath:
méthode de votre délégué (si elle est définie). C'est pourquoi il a besoin du chemin d'index.
dequeueReusableCellWithIdentifier:forIndexPath:
sera toujours retourner une cellule. Il réutilise des cellules existantes ou en crée une nouvelle et retourne s'il n'y a pas de cellules.Alors que, le traditionnel
dequeueReusableCellWithIdentifier:
retournera une cellule si elle existe, c'est-à-dire s'il y a une cellule qui peut être réutilisée, il retourne que sinon, il retourne nil. Vous devrez donc également écrire une condition pour vérifier lanil
valeur.Pour répondre à votre question, utilisez
dequeueReusableCellWithIdentifier:
lorsque vous souhaitez prendre en charge iOS 5 et les versions inférieures, cardequeueReusableCellWithIdentifier:forIndexPath
disponible uniquement 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 :
la source
[self.tableView registerNib:[UINib nibWithNibName:@"cell" bundle:nil] forCellReuseIdentifier:@"cell"];
Je n'ai jamais compris pourquoi Apple a créé la nouvelle méthode, dequeueReusableCellWithIdentifier: forIndexPath :. Leur documentation n'est pas complète et est quelque peu trompeuse. La seule différence que j'ai pu discerner entre les deux méthodes, c'est que cette méthode plus ancienne peut renvoyer nil, si elle ne trouve pas de cellule avec l'identifiant passé, tandis que la nouvelle méthode plante, si elle ne peut pas retourner une cellule. Les deux méthodes sont garanties de renvoyer une cellule, si vous avez correctement défini l'identifiant, et de créer la cellule dans un storyboard. Les deux méthodes sont également garanties de renvoyer une cellule si vous enregistrez une classe ou un xib et que vous créez votre cellule dans du code ou un fichier xib.
la source
tableView.estimateHeight
, la taille de la cellule sera également déterminée correctement. Je ne profite toujours pas de la nouvelle méthode.Pour faire court:
Hollemans M. 2016, Liste de contrôle du chapitre 2, IOS Apprentice (5e édition). pp: 156.
la source
Je recommanderais d'utiliser les deux si vous utilisez du contenu généré dynamique. Sinon, votre application pourrait se bloquer de manière inattendue. Vous pouvez implémenter votre propre fonction pour récupérer une cellule réutilisable facultative. Si c'est le cas,
nil
vous devez renvoyer une cellule vide qui n'est pas visible:Swift 3
Et l'extension pour renvoyer une cellule vide:
Un exemple complet de son utilisation:
la source