2010-02-28 4 views
0

mises en cache Quand j'ajouter une étiquette à une cellule en utilisant:RETOURS iPhone cellForRowAtIndexPath cellules

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{ 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    [cell addSubView:someLabel]; 
} 

Il ajoute l'étiquette multple cellules, car il ajoute l'étiquette à une cellule en cache. Donc, chaque cellule de la tableView thats utilise une cellule en cache, affichera mon label.

Est-ce que quelqu'un sait comment s'y prendre? Ton

Répondre

0

Vous devez savoir si chaque cellule possède ou non l'étiquette actuellement appliquée. Dans cellForRowAtIndexPath: vérifier s'il devrait être là, si oui alors ajoutez-le si nécessaire, sinon retirez-le si nécessaire.

+0

merci pour votre réponse, mais pourquoi devrais-je faire cela? Quand de nouvelles cellules arrivent à l'écran, il reconstruit la cellule, donc mon label ne devrait même pas être le leur. Je veux seulement que mon étiquette existe si l'utilisateur appuie sur le bouton d'accessoire, quand la cellule disparaît de la vue, elle devrait disparaître parce qu'elle reconstruira la cellule. – Ton

+0

Donc vous utilisez la même cellule à plusieurs endroits, mais vous voulez changer une seule instance? Votre meilleur pari est probablement de copier la cellule de référence et ajouter l'étiquette, puis basculer entre ces deux si nécessaire. –

1

Si votre cellule est une sous-classe de UITableViewCell, vous pouvez remplacer - (void)prepareForReuse qui est appelée juste avant que la cellule est renvoyée par - (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier

Ceci est le moyen de fournir une « table rase » pour vos cellules, mais seulement ceux mis en cache qui sont sur le point d'être réutilisés.

2

Donner le nom d'identifiant unique comme:

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    static NSString *CellIdentifier = NSLocalizedString(@"Cell",@""); 
… 
} 

au lieu de donner le nom d'identifiant constatnt, donnez votre nom d'identifiant unique comme:

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    static NSString *CellIdentifier = [self getuniqueID]; 
... 
} 

Cela permettra de résoudre votre problème.

+0

Bien sûr, mais vous perdez sur les performances de défilement. Cela peut être bien pour une petite table, mais s'il y a des centaines de lignes ... – jamesmoschou

1

Pourquoi ne pas simplement simplifier les choses et simplement masquer l'étiquette par défaut et l'inclure sur toutes les cellules. Lorsque vous appuyez sur la cellule, alors au lieu d'ajouter une vue, affichez simplement celle qui est présente mais cachée.

Lorsque vous avez terminé, masquez l'étiquette.

0

J'utilise parfois ce code: (Lorsque la cellule = nul!)

NSArray *subviews = [[NSArray alloc] initWithArray:cell.contentView.subviews]; 
for (UIView *subview in subviews) { 
    [subview removeFromSuperview]; 
} 
[subviews release]; 

Il supprime toutes les sous-vues d'une cellule en cache.

Questions connexes