Mantener offset cuando reloadRowsAtIndexPaths

Estoy intentando volver a cargar una sola tablaViewCell, pero se desplaza hacia arriba cada vez que lo hago … No estoy agregando ni eliminando celdas, solo quiero cambiar el color de las celdas seleccionadas.

Esto es lo que hago en cellForRowAtIndexPath:

SMPChoiceViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ChoiceCell" forIndexPath:indexPath]; SMPChoice *choice = self.choices[indexPath.row - 1]; cell.choiceTextLabel.text = choice.text; if ([self.selectedChoices indexOfObject:choice] != NSNotFound) { cell.choiceTextLabel.textColor = [UIColor purpleColor]; } else { cell.choiceTextLabel.textColor = [UIColor blackColor]; } 

Y esto es lo que hago en el método didSelectRowAtIndexPath

 if ([self.selectedChoices indexOfObject:choice] != NSNotFound) { [self.selectedChoices removeObject:choice]; } else { [self.selectedChoices addObject:choice]; } CGPoint offSet = [tableView contentOffset]; [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; [tableView setContentOffset:offSet animated:NO]; 

Pero simplemente salta, ¿alguna sugerencia?

PS Seguí este hilo pero no resolvió mi pregunta Llamar a reloadRowsAtIndexPaths elimina tableView contentOffset

Sé que esta es una vieja pregunta, pero tuve el mismo problema y no pude encontrar la respuesta en ninguna parte.

Después de reloadRowsAtIndexPaths:withRowAnimation: tableView determina su desplazamiento usando las alturas estimadas que se dan en tableView:estimatedHeightForRowAtIndexPath: Entonces, a less que el valor que devuelva allí sea preciso, su implementación provocará que el offset de tableView cambie después de la recarga. No implementé tableView:estimatedHeightForRowAtIndexPath: y el problema se solucionó.

Porque, por alguna razón misteriosa, la vista de tabla determina el nuevo desplazamiento después de volver a cargar algunas celdas utilizando la altura de fila estimada, desea asegurarse de que tableView:estimatedHeightForRowAtIndexPath devuelva datos correctos para celdas que ya se han procesado. Para lograr esto, puede almacenar en caching las alturas de fila vistas en un dictionary, luego use esta información correcta (o su estimación para las celdas no cargadas).

 fileprivate var heightForIndexPath = [NSIndexPath: CGFloat]() fileprivate let averageRowHeight: CGFloat = 300 //your best estimate //UITableViewDelegate override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { heightForIndexPath[indexPath] = cell.frame.height } override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return heightForIndexPath[indexPath] ?? averageRowHeight } 

(GRANDE gracias a la opinión de que la altura estimada de las filas se usa para determinar el nuevo desplazamiento).