2009-04-09 7 views
2

J'ai une implémentation personnalisée UITableViewCell (tirant parti des étiquettes comme sous-vues) qui rend la liste des éléments correctement, mais quand je descends et sélectionne un élément (disons le numéro 43 sur 100), je vois un rendu d'une cellule plus tôt dans la liste (par exemple, le numéro 3 sur la première page de rendu dans le tableau) apparaissent en haut de la cellule que j'ai sélectionnée.UITableViewCell écrasé lors de la sélection?

Voici ma méthode:

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
    } 
    // index of table view correlates to index of array 
    Card *card = [cards objectAtIndex:indexPath.row]; 

    UILabel *cardNameLbl = [[[UILabel alloc] initWithFrame:CGRectMake(10.0, 3.0, 200.0, 18.0)] autorelease]; 
    cardNameLbl.tag = CARD_NAME_TAG;  
    cardNameLbl.text = card.name; 
    cardNameLbl.font = [UIFont systemFontOfSize:12.0]; 
    cardNameLbl.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight; 
    [cell.contentView addSubview:cardNameLbl]; 

    UILabel *cardNumLbl = [[[UILabel alloc] initWithFrame:CGRectMake(10.0, 21.0, 100.0, 18.0)] autorelease];  
    cardNumLbl.tag = CARD_NUM_TAG; 
    cardNumLbl.text = card.number; 
    cardNumLbl.font = [UIFont systemFontOfSize:12.0]; 
    cardNumLbl.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight; 
    [cell.contentView addSubview:cardNumLbl]; 

    UILabel *cardTypeLbl = [[[UILabel alloc] initWithFrame:CGRectMake(110.0, 21.0, 200.0, 18.0)] autorelease]; 
    cardTypeLbl.tag = CARD_TYPE_TAG; 
    cardTypeLbl.text = card.type; 
    cardTypeLbl.font = [UIFont systemFontOfSize:12.0]; 
    cardTypeLbl.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight;  
    [cell.contentView addSubview:cardTypeLbl]; 

    UILabel *cardQuantityLbl = [[[UILabel alloc] initWithFrame:CGRectMake(250.0, 3.0, 50.0, 18.0)] autorelease];  
    cardQuantityLbl.tag = CARD_QUANTITY_TAG; 
    cardQuantityLbl.text = [NSString stringWithFormat:@"%d", card.have]; 
    cardQuantityLbl.font = [UIFont systemFontOfSize:12.0]; 
    cardQuantityLbl.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight; 
    [cell.contentView addSubview:cardQuantityLbl]; 

    return cell; 
} 

Répondre

5

En général, ces types d'erreurs (affichage des données d'une ligne dans un autre) indique que vous n'êtes pas régler les parties de vos cellules réutilisables, donc il est juste en utilisant vieux données, mais je ne trouve aucune partie qui ne soit pas réinitialisée. Cependant, une chose que vous devez absolument faire, et qui pourrait réellement résoudre ce problème, est la sous-classe UITableViewCell, qui maintient ces étiquettes comme ivars. Ensuite, vous pouvez initialiser les étiquettes et les ajouter en tant que sous-vues une fois, dans la méthode init, ou partout ailleurs. Ce qui se passe actuellement est: chaque fois que vous récupérez une cellule réutilisable, elle a potentiellement déjà ces étiquettes d'avant, et vous empilez simplement plus de sous-vues sur les sous-vues. (Sauf si je me trompe et qu'une cellule réutilisable a ses sous-vues effacées avant qu'elle ne soit retournée.)

+0

Oui, je pense que vous avez raison à propos de la cellule qui conserve les anciennes données ... Je trouve juste étrange que cela soit déclencheur sur une sélection de cellules. Savez-vous quelles méthodes sont déclenchées quand select est appelé qui déclencherait un rendu? Je ne pense pas que tableView: didSelectRowAtIndexPath: le fait. – Greg

+0

Dans la classe UITableViewCell, il y a une méthode appelée: - (void) setSelected: (BOOL) a choisi animé: (BOOL) animé Mais je ne sais pas pourquoi ce serait à l'origine des sous-vues pour devenir mal ordonnée. –

+0

J'ai implémenté une sous-classe de UITableViewCell et je n'ai plus ce comportement. Étrange ... aimerais toujours comprendre cela. – Greg

Questions connexes