2012-10-13 5 views
2

Lorsque la cellule devient visible pour la première fois, la méthode init est utilisée. Lorsque la cellule devient visible pour la première fois, elle sera supprimée de la mémoire de la vue de la table.UITableView supprime toutes les cellules réutilisables

UITableViewCell *cell = [searchTable dequeueReusableCellWithIdentifier:identifier]; 
if (cell == nil) 
{ 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier]; 
} 
return cell; 

Disons que je l'ai fait défiler toute la table et maintenant une cellule peut être dequeued parce qu'ils ont tous déjà été initialisé.

Mes cellules actuelles ont des identifiants de 0 à 199. Je rafraîchis ma vue de table et maintenant j'ai de nouvelles informations pour les cellules. J'utilise des identificateurs de méthode reloadData et l'utilisation de 200 à 399 pour les nouvelles cellules en ajoutant +200 aux cellules identifiant:

NSInteger index = indexPath.row + 200; 
NSString *CellIdentifier = [NSString stringWithFormat:@"%d",index]; 

Maintenant, je défiler toute la table et voir les cellules de 200 à 399.

laisse imaginer que je change index Retour à:

NSInteger index = indexPath.row; 

maintenant une question: vieilles cellules avec des identificateurs de 0 à 199 peuvent encore être dequeued, ne peuvent-ils?

Si la réponse est They CAN be dequeued J'ai une autre question:

est-il un moyen d'éliminer les cellules avec des identifiants de 0 à 199 de la table mémoire de vue quand je commence à utiliser des cellules avec des identifiants de 200-399?

Répondre

3

UITableViewdequeueReusableCellWithIdentifier la méthode gérera cela pour vous. Il ne décevra que les cellules visibles et pas toutes les 200 cellules si vous utilisez static [iTableView dequeueReusableCellWithIdentifier:cellIdentifier];

Voici une discussion à ce sujet de apple discussion thread. Vérifiez cela aussi.

Mise à jour: Vous devez modifier l'identifiant de votre cellulaire. Si vous créez un nouvel identifiant CellIdentifier pour chaque ligne, il est inutile d'utiliser dequeueReusableCellWithIdentifier car l'identifiant est différent à chaque fois.

Au lieu de

NSString *CellIdentifier = [NSString stringWithFormat:@"%d",index]; 

Il devrait être,

static NSString *CellIdentifier = [NSString [email protected]"cell"]; 

Cela signifie que chaque cellule sera réutilisé une fois que le même n'est pas visible. Il choisira simplement les cellules qui ne sont pas visibles et les réutilisera pour votre prochaine série de cellules qui seront affichées. Selon votre implémentation, il va créer 300 ou 400 cellules et vous ne pouvez pas faire grand-chose pour supprimer les précédentes car vous n'avez plus aucune référence à la même chose.

Votre méthode ressemblera à ceci,

static NSString *CellIdentifier = [NSString [email protected]"cell"]; 
UITableViewCell *cell = [searchTable dequeueReusableCellWithIdentifier:Cellidentifier]; 
if (cell == nil) 
{ 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:Cellidentifier]; 
} 
cell.textLabel.text = @"something"; 
//... 
return cell; 

Update2: Si vous ne l'utilisez ARC, il devrait être,

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:Cellidentifier] autorelease]; 

Vous devez avoir un autorelease pour la même.

+0

Pouvez-vous expliquer comment obtenez-vous 200 nouvelles cellules? Veuillez passer par ce lien, https://discussions.apple.com/thread/2760904?start=0&tstart=0. À la fois, vous n'aurez que les cellules visibles dans votre mémoire si vous utilisez dequeueReusableCellWithIdentifier. Les autres cellules sont automatiquement supprimées de la mémoire. Lorsque vous actualisez, il va juste réutiliser les mêmes cellules et seules les données à l'intérieur des cellules vont changer. Il ne va jamais aller comme 200, 400 et tout. Il sera idéalement limité au nombre de cellules visibles ce qui pourrait être dit 10. – iDev

+0

J'ai corrigé une erreur dans cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: Cellidentifier]; S'il vous plaît vérifier la réponse. – iDev

Questions connexes