2010-09-22 3 views
0

Dans cellForRowAtIndexPath J'ajoute un UIImageView à cell.contentView. Le problème est que lorsque la cellule fait défiler l'écran et se rallume, elle rajoute la même image par-dessus celle qui est déjà là. Cela se produit continuellement jusqu'à ce que j'obtienne une image floue très empilée.uitableview - les images personnalisées continuent de se charger dans cell.contentView

Devez-vous continuer à supprimer les vues d'image que vous ajoutez à cell.contentView? Si oui, dans quelle méthode de délégué faites-vous cela?

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

    static NSString *CellIdentifier = @"CellIdentifier"; 

    MyTableCell *cell = (MyTableCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MyTableCell" owner:self options:nil]; 
     cell = [nib objectAtIndex:0]; 
    } 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.jpg"]]; 

    imageView.center = CGPointMake(310, 48); 
    [cell.contentView addSubview:imageView]; 
    [imageView release]; 
    return cell; 
} 
+1

Il est un peu difficile de dire sans code pour voir ce qui se passe, mais il semble que votre problème soit probablement lié à la réutilisation des cellules de la table, ce qui est une pratique recommandée et est généralement implémentée par le modèle XCode. Pouvez-vous poster une partie de votre code? –

+0

ajouté un peu de code – sol

+0

juste par curiosité, si vous chargez la cellule à partir d'une plume, pourquoi ne pas ajouter l'image dans la plume au lieu de le faire par programmation? – filipe

Répondre

3

Si vous ne voulez pas continuer à mettre imageViews dans votre cellule, vous devez faire toute la personnalisation à l'intérieur du bloc if(cell==nil), sinon il va ajouter un à chaque fois une cellule réutilise. Lorsque vous utilisez le recyclage des cellules, vous devez toujours conserver tout ce qui est cohérent pour toutes les cellules de ce bloc afin qu'elles ne soient ajoutées qu'une seule fois.

Ex:

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

    static NSString *CellIdentifier = @"CellIdentifier"; 

    MyTableCell *cell = (MyTableCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MyTableCell" owner:self options:nil]; 
     cell = [nib objectAtIndex:0]; 

     //Add custom objects to the cell in here! 
     UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.jpg"]]; 

     imageView.center = CGPointMake(310, 48); 
     [cell.contentView addSubview:imageView]; 
     [imageView release]; 
    } 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 


    return cell; 
}
+0

oui, bien sûr! Merci. – sol

1

Si chaque cellule doit avoir besoin d'une autre image, vous pouvez essayer quelque chose comme ceci:

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

    static NSString *CellIdentifier = @"CellIdentifier"; 
    static const int ImageViewTag = 1234; //any integer constant 

    MyTableCell *cell = (MyTableCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    UIImageView *imageView; 
    if (cell == nil) 
    { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MyTableCell" owner:self options:nil]; 
     cell = [nib objectAtIndex:0]; 

     //Add custom objects to the cell in here! 
     imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0, imgWidth, imgHeight)]; 

     imageView.center = CGPointMake(310, 48); 
     imageView.tag = ImageViewTag; 
     [cell.contentView addSubview:imageView]; 
     [imageView release]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    } 
    else 
    { 
     imageView = [cell viewWithTag:ImageViewTag]; 
    } 
    imageView.image = yourUIImageForThisCell; 

    return cell; 
} 
+0

Et comme filipe l'a souligné dans un commentaire ci-dessus, c'est encore plus facile si vous ajoutez simplement UIImageView à la plume en premier lieu - alors tout ce que vous avez à faire est de définir la propriété image UIImageView à l'UIImage que vous voulez. J'ai utilisé cette méthode si souvent que je l'ai dans une classe abstraite sur laquelle la plupart de mes contrôleurs de vue de table sont basés. – Echelon

Questions connexes