2009-03-10 4 views
2

J'ai une classe qui s'étend UITableViewCell. Dans le cadre de cet exercice, appelons-le "CustomCell". Dans CustomCell, j'ai une configuration UIImageView IBOutlet. Dans ce cas, le nom de l'instance d'image est myImage. Je souhaite afficher cette image en fonction de certains critères qui reviennent d'un serveur. Ces données sont un dictionnaire que dans cet exercice nous appellerons "serverData". Au début, UITableView rend très bien avec l'UIImageView qui apparaît dans les cellules comme il le devrait. Le problème se produit lorsque je commence à faire défiler le UITableView réel, l'image est perdue. D'une manière ou d'une autre, il n'est pas correctement mis en cache ou retiré de la file d'attente. Je ne sais pas où est le problème ou comment améliorer ce code. Voici un extrait:UITableViewCell comportement bizarre lorsque la table fait défiler hors de vue

- (UITableViewCell *)tableView:(UITableView *)tableView 
    cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CustomCellIdentifier = @"CustomCellIdentifier"; 
    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CustomCellIdentifier]; 
    if (cell == nil) { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" 
                owner:self options:nil]; 

     cell = (CustomCell *)[nib objectAtIndex:0]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    }  

     NSDictionary *serverData = myData // previously defined. 
     if ([[serverData valueForKey:@"foo"] isEqualToString:@"0"]) 
      cell.myImage.hidden = YES; 
     cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; 
     return cell; 
}  
+0

est-ce que l'image se perdre lors du défilement (par exemple, il disparaît) ou lorsque la cellule est complètement hors de l'écran défile, puis défiler en arrière sur? –

Répondre

5

Pour des raisons mémoire UITableView cellules réutilise lors du défilement (le dequeueReusableCellWithIdentifier par exemple) appel. Cela signifie que la cellule que vous avez reçue peut avoir été configurée de manière à être utilisable avec cet identificateur. Vous devez donc réinitialiser toutes ces propriétés.

Dans votre cas, je suppose que vous êtes donné une cellule avec une image qui avait été caché si cela corriger:

NSDictionary *serverData = myData // previously defined. 
    if ([[serverData valueForKey:@"foo"] isEqualToString:@"0"]) 
    cell.myImage.hidden = YES; 
    else 
    cell.myImage.hidden = NO; 
3

Rappelez-vous que vos cellules sont réutilisés, vous devez réinitialiser la cellule .myImage.hidden valeur chaque fois que vous utilisez cette cellule

if (cell == nil) { 
      NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" 
                            owner:self options:nil]; 

      cell = (CustomCell *)[nib objectAtIndex:0]; 
      cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    } else { 
      cell.myImage.hidden = NO; 
    } 
Questions connexes