2009-11-27 6 views
1

J'utilise la méthode suivante dans mon application:cellules de format iPhone + UITableView +

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if(indexPath.row == 0) 
    { 
     cell.contentView.backgroundColor = [UIColor lightGrayColor]; 
     cell.contentView.alpha = 0.5; 
    } 
} 

Quand je lance l'application j'ai 7 lignes dans ma table. Selon la fonction ci-dessus, seule la cellule de la première ligne (numéro de ligne 0) doit être formatée (en raison de la condition if).

La cellule de la première rangée (numéro de ligne 0) est formatée correctement (selon la sortie souhaitée). Mais si je fais défiler la table vers le bas une cellule de plus est affichée comme formatée: cellule à la ligne numéro 5.

Pourquoi?

Répondre

4

Je suis d'accord avec la réponse de Vladimir. Cependant, je crois aussi que vous devriez suivre une approche différente.

Dans la situation actuelle, vous formatez fréquemment votre cellule, car la méthode est appelée dans chaque défilement, ce qui vous conduit à une performance sous-optimale.

Une solution plus élégante consiste à formater la 1ère ligne différemment que d'autres "une seule fois": lorsque vous créez vos cellules.

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

     static NSString *CellIdentifier; 
     if(indexPath.row == 0) 
     CellIdentifier = @"1stRow"; 
     else 
     CellIdentifier = @"OtherRows"; 

     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
     if (cell==nil) { 
      cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
      if(indexPath.row == 0){ 
       cell.contentView.backgroundColor = [UIColor lightGrayColor]; 
       cell.contentView.alpha = 0.5; 
        // Other cell properties:textColor,font,... 
      } 
      else{ 
       cell.contentView.backgroundColor = [UIColor blackColor]; 
       cell.contentView.alpha = 1; 
       //Other cell properties: textColor,font... 
      } 

     } 
     cell.textLabel.text = ..... 
     return cell; 
    } 
4

Je pense que la raison est que TableView réutilise les cellules déjà existantes et les affiche si c'est possible. Que se passe-t-il ici - lorsque la table est défilée et que la ligne 0 devient invisible, alors la cellule correspondante est utilisée pour une ligne nouvellement affichée. Donc, si vous réutilisez des cellules, vous devez réinitialiser leurs propriétés:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if(indexPath.row == 0) { 
     cell.contentView.backgroundColor = [UIColor lightGrayColor]; 
     cell.contentView.alpha = 0.5; } 
    else 
    { 
    // reset cell background to default value 
    } 
} 
Questions connexes