Domanda

Sto usando il seguente metodo nella mia applicazione:

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

Quando eseguo l'applicazione ho 7 righe nella mia tabella. In base alla funzione precedente, solo la cella della prima riga (numero riga 0) deve essere formattata (a causa della condizione if).

La cella della 1a riga (riga numero 0) è formattata correttamente (come da output desiderato). Ma se scorro la tabella verso il basso, viene visualizzata un'altra cella come formattata: cella alla riga numero 5.

Perché sì?

È stato utile?

Soluzione

Sono d'accordo con la risposta di Vladimir. Tuttavia, credo anche che dovresti seguire un approccio diverso.

Nella situazione attuale stai formattando frequentemente la tua cella, poiché il metodo viene chiamato in ogni scorrimento e questo ti porta a una performance non ottimale.

Una soluzione più elegante è quella di formattare la prima riga in modo diverso rispetto alle altre solo una volta "una volta" : quando crei le tue celle.

    // 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;
    }

Altri suggerimenti

Penso che il motivo sia che TableView riutilizza le celle già esistenti e le visualizza se possibile. Cosa succede qui: quando la tabella viene fatta scorrere e la riga 0 diventa invisibile, la cella corrispondente viene utilizzata per una riga appena visualizzata. Quindi, se stai riutilizzando le celle, devi ripristinare le loro proprietà:

-(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
   }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top