Question

J'utilise la méthode suivante dans mon application:

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

Lorsque j'exécute l'application, ma table contient 7 lignes. 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 ligne (numéro de ligne 0) est correctement formatée (conformément à la sortie souhaitée). Mais si je fais défiler le tableau vers le bas, une cellule supplémentaire apparaît sous la forme suivante: cellule de la ligne numéro 5.

Pourquoi ça?

Était-ce utile?

La solution

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

Dans la situation actuelle, vous formatez fréquemment votre cellule, la méthode étant appelée dans chaque défilement, ce qui vous conduit à des performances sous-optimales.

Une solution plus élégante consiste à formater la 1ère rangée différemment des autres uniquement "une 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;
    }

Autres conseils

Je pense que la raison en est que TableView réutilise les cellules déjà existantes et les affiche si cela est possible. Que se passe-t-il ici? Lorsque le tableau défile et que la ligne 0 devient invisible, sa cellule correspondante est utilisée pour une nouvelle ligne 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
   }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top