2010-10-12 6 views
0

J'ai le problème suivant:Rafraîchissement du contenu des cellules après la suppression des cellules

J'ai un UITableView avec du texte et des images comme contenu. Le TextLabel de la cellule affiche le texte et j'ajoute un UIView avec certains UIImageViews comme sous-vue à la vue de contenu des cellules. Tout fonctionne bien jusqu'à ce que je supprime certaines cellules. Qu'est-ce qui se passe est, je supprime une cellule (disons le premier) de la table, recharger ses données et par exemple. alors la deuxième cellule se déplace plus haut MAIS! l'UIView à droite contient le contenu de la première cellule (supprimée). Je ne sais pas pourquoi cela se produit - même si je suppose que quelque chose ne va pas dans la méthode de rappel cellForRowAtIndexPath.

Je vais coller du code pour le rendre plus clair.

Ce que je peux faire, est décharger le contrôleur et le charger à nouveau - puis les images contiennent le contenu correct à nouveau ....

Heres mon code:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 



static NSString *MyIdentifierUNCHECK = @"MyIdentifierUNCHECK"; 


MyStuff *m = [allObjects objectAtIndex:indexPath.row]; 
UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:MyIdentifierUNCHECK]; 
    UIView *v;  
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifierUNCHECK] autorelease]; 
     v = [[[UIView alloc] initWithFrame:CGRectMake(5.0, 5.0, 70.0, 70.0)] autorelease]; 

     v.contentMode = UIViewContentModeScaleAspectFill; 
     [v addSubview:[[UIImageView alloc] init]];//some image view 
     [cell.contentView addSubview:v]; 
    } 

    cell.textLabel.text = m.name; 
    cell.textLabel.numberOfLines = 0; 
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica-BoldOblique" size:14.0]; 
    cell.imageView.image = [UIImage imageNamed:@"checkbox.png"]; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

    return cell; 
+0

Do vous avez synchronisé votre modèle (allObjects), c'est-à-dire que les indices correspondent? Peut-être montrer le code de suppression aussi bien. – Eiko

Répondre

2

Je suppose par « vue dans le droit » vous dire la vue que vous instanciez là pour votre cellule ... Le problème se produit ici parce que vous réutilisez des cellules et ne réinitialisez pas l'UIView pour chaque cellule, vous verrez le même problème se produire si vous avez assez de cellules que vous pouvez faire défiler. Lorsque vous réutilisez les cellules, vous devez toujours supposer qu'ils ont des données sales et doivent les recharger avec les bonnes données, dans votre cas, votre erreur est dans cet extrait:

if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifierUNCHECK] autorelease]; 
    v = [[[UIView alloc] initWithFrame:CGRectMake(5.0, 5.0, 70.0, 70.0)] autorelease]; 

    v.contentMode = UIViewContentModeScaleAspectFill; 
    [v addSubview:[[UIImageView alloc] init]];//some image view 
    [cell.contentView addSubview:v]; 
} 

Vous n'instanciation la vue dans la cellule lorsque son premier attribué, donc c'est ce qui se passe ... 1- Vous faites d'abord toutes vos cellules et faites leur "bonne vue" 2- Vous supprimez une cellule 3- Pour votre deuxième cellule, le système réutilise le UITableViewCell qui vous avez créé comme première cellule 4- Puisque la cellule n'est pas nulle, l'UIView n'est pas en cours de définition et ce que vous voyez est la première cellule UIView pour la seconde cellule

Comme vous ne réinitialisez pas les cellules UIView, vous voyez une mauvaise vue dans la cellule au lieu de celle que vous attendez.

Pour corriger cela, vous pouvez choisir de ne pas réutiliser les cellules ou vous pouvez déplacer le code qui ajoute le UIView à se produire à chaque fois cellForRowAtIndexPath est appelé, de cette façon le droit UIView sera chargé de la cellule de droite

+0

correct! merci de reformuler cela, je devrais vraiment lire l'api plus approfondie .... – Icky

0

I (heureusement :)) l'a compris - j'aurais dû prendre le point de vue, qui existait déjà, du contenu de mes cellules ... et échanger son contenu. C'est pourquoi je l'ai tagué d'abord .... cela m'a aidé:

v = [cell.contentView viewWithTag:PRICE_TAG]; 
    for (UIView *t in v.subviews) { 
     [t removeFromSuperview]; 
    } 
    [v addSubview:[self setupPrice:m.price]]; 

devriez lire plus de documentation ....

Questions connexes