iOS: la vista de tabla desactiva la actualización al desplazarse hacia abajo

Estoy haciendo una simple function "Agregar a favoritos" que es un UITableViewController. Cuando el usuario seleccionó una celda, puse el color en gris y deshabilité el estilo de selectionStyle

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; cell.textLabel.textColor = [UIColor grayColor]; cell.selectionStyle = UITableViewCellSelectionStyleNone; } 

Mi primer problema fue que cada vez que seleccionaba una celda, otras celdas también cambiaban de color. Entonces eliminé el siguiente código para evitar que esto sucediera:

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

Pero aún tengo un problema extraño: después de desplazarme por la vista de la table y volver a la parte superior de la misma, noto que todas las celdas que seleccioné volvieron al color pnetworkingeterminado y la última celda seleccionada se resalta en azul.

Así que estoy equivocado, pero supongo que la tablaview se está actualizando cuando se desplaza y quiero desactivar este comportamiento.

Gracias de antemano por tu ayuda.

Le falta una comprensión fundamental de la forma en que UITableView presenta sus subprocesss (UITableViewCells). Sugeriría leer la guía de progtwigción UITableView . Nunca quite la llamada dequeueReusableCellWithIdentifier en la vista de tabla, esto es muy importante para el performance.

Para su problema: necesita hacer un seguimiento del estado de cada celda y establecer el estado de selección en cellForRowAtIndexPath :, UITableView reutiliza las celdas siempre que puede, y actualiza las celdas cuando se desplazan dentro y fuera de la pantalla.

Una implementación muy simple sería:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (![self.selectedRows containsObject:indexPath]) [self.selectedRows addObject:indexPath]; else [self.selectedRows removeObject:indexPath]; [tableView reloadRowsAtIndexPaths:@[indexPath]]; } 

y en cellForRow

 if ([self.selectedRows containsObject:indexPath]) { cell.textLabel.textColor = [UIColor grayColor]; cell.selectionStyle = UITableViewCellSelectionStyleNone; } else { //set the normal cells values } 

Para la eficiencia, las celdas de la tabla se reutilizan a medida que las celdas se desplazan fuera de la pantalla. Esto es normal y deseado. Vaya con eso, no intente vencerlo.

Debe realizar un seguimiento de las filas que se han seleccionado en algún lugar que no sea la propia célula, ya que se perderá cuando se desplace fuera de la pantalla. Sugiero crear una propiedad en el controller de vista, como una matriz de NSNumbers que son BOOLs. Cuando se selecciona una celda, establezca el bool en true correspondiente a su fila, y luego puede cambiar el color del text de la celda.

Cuando se quita una celda, debe establecer su color en function de su matriz. Eso asegurará que su celda tenga el color correcto mientras se desplaza dentro y fuera de la pantalla.

No querrá deshabilitar la function más importante que proporciona UITableViewController porque este truco de eliminación / creación le brinda el desplazamiento rápido que probablemente desee.

Tan pronto como las celdas se desconectan de la pantalla (dependiendo de la altura de la fila del control tableviewcontroller) se desasignan (se eliminan de la memory). Si se trata de una celda entrante (desde fuera de la pantalla), se creará de acuerdo con el método cellForRowAtIndexPath (creación).

Es posible que desee utilizar un DataSource para crear y save estados, por lo que no perderá sus properties.

o testing esto

 UITableViewCell *cell = [tableView dequeueReusableCellWithReuseIdentifier:@"MY_CELL" forIndexPath:indexPath];