Pregunta

Estoy usando el siguiente método en mi aplicación:

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

Cuando ejecuto la aplicación tengo 7 filas en mi tabla. De acuerdo con la función anterior, solo se debe formatear la celda de la primera fila (número de fila 0) (debido a la condición if).

La celda de la primera fila (número de fila 0) está formateada correctamente (según la salida deseada). Pero si me desplazo hacia abajo, una celda más se muestra con el formato: celda en la fila número 5.

¿Por qué?

¿Fue útil?

Solución

Estoy de acuerdo con la respuesta de Vladimir. Sin embargo, también creo que debería seguir un enfoque diferente.

En la situación actual, está formateando su celda con frecuencia, ya que se llama al método en cada desplazamiento, y esto lo lleva a un rendimiento subóptimo.

Una solución más elegante es formatear la primera fila de manera diferente a otras solo " una vez " : cuando creas tus celdas.

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

Otros consejos

Creo que la razón es que TableView reutiliza las celdas ya existentes y las muestra si es posible. Qué sucede aquí: cuando la tabla se desplaza y la fila 0 se vuelve invisible, entonces se usa la celda correspondiente para una fila que se muestra recientemente. Entonces, si estás reutilizando celdas, debes restablecer sus propiedades:

-(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
   }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top