La celda seleccionada de UITableView no se selecciona cuando se desplaza

Tengo problemas con las celdas de vista de tabla que no mantienen su estado "seleccionado" al desplazarme por la tabla. Aquí está el código relevante:

@property (nonatomic, strong) NSIndexPath *selectedIndexPath; -(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { self.selectedIndexPath = indexPath; //do other stuff } -(UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { MyCustomCell_iPhone* cell = [tableView dequeueReusableCellWithIdentifier:@"MyCustomCell_iPhone"]; if (cell == nil) cell = [[[NSBundle mainBundle] loadNibNamed:@"MyCustomCell_iPhone" owner:self options:nil] objectAtIndex:0]; if ([indexPath compare: self.selectedIndexPath] == NSOrdenetworkingSame) { [cell setSelected:YES animated:NO]; } return cell; } 

Y para la celda:

 - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; if (selected) { self.selectedBg.hidden = NO; }else{ self.selectedBg.hidden = YES; } } - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { [super setHighlighted:highlighted animated:animated]; if (highlighted) { self.selectedBg.hidden = NO; }else{ self.selectedBg.hidden = YES; } } 

¿Cómo puedo hacer que la celda seleccionada se mantenga resaltada? Si lo desploop fuera de la pantalla, cuando se desplaza hacia atrás en la pantalla aparece en su estado no seleccionado (con su BG seleccionado oculto).

EDITAR: Eliminar el método setHighlighted de la celda corrige el problema. Sin embargo, eso significa que no obtengo ningún estado resaltado al presionar la celda de la tabla. Me gustaría saber la solución a esto.

Tenía el mismo problema, el AccessView de la celda seleccionada desapareció en el desplazamiento. Mi compañero de trabajo encontró bastante pirateado para este problema. La razón es que en iOS 7 en toques, el evento de order UITableView deselecciona la celda seleccionada y selecciona la celda tocada. En iOS 6 no sucede y en la celda seleccionada de desplazamiento permanece seleccionada. Para get el mismo comportamiento en iOS 7 testing:

1) Habilite la selección múltiple en su tableView.

2) Vaya al método tableView delegate didSelectRowAtIndexPath , y anule la selección de la celda tocada con el código:

  NSArray *selectedRows = [tableView indexPathsForSelectedRows]; for(NSIndexPath *i in selectedRows) { if(![i isEqual:indexPath]) { [tableView deselectRowAtIndexPath:i animated:NO]; } } 

Solucionado mi problema Espero que sea útil, lo siento por mi pobre inglés por cierto.

Sé que mi método no es muy ortodoxo, pero parece funcionar. Aquí está mi solución:

 func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { if cell.selected { cell.selected = true } else { cell.selected = false } } 

Debe implementar todos los methods que mencionó en su publicación también (@soleil)

iOS 7/8 ambos deseleccionan la celda cuando comienza el desplazamiento (como lo señaló Alexander Larionov).

Una solución más simple para mí fue implementar este método UIScrollViewDelegate en mi ViewController:

  - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { NSInteger theRow = [self currentRowIndex]; // my own method NSIndexPath *theIndexPath = [NSIndexPath indexPathForRow:theRow inSection:0]; [self.myTableView selectRowAtIndexPath:theIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; } 

Esto funciona porque mi viewController es el delegado de UITableView y UITableView henetworkinga de UIScrollView.

Si quieres lograr lo mismo en Swift, aquí está el código. Por cierto, estoy usando Xcode 7.2 con Swift 2.1.

 override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { if cell.selected == true{ cell.selected = true cell.backgroundColor = UIColor.blackColor() }else{ cell.backgroundColor = tableViewCellColor //Don't panic its my own custom color created for the table cells. cell.selected = false } } 

Haz otras personalizaciones que quieras …

Gracias..

Espero que esto haya ayudado.

¿Ha intentado comparar las filas de las routes de índice en lugar de todo el object de ruta de índice?

 if ((indexPath.row == self.selectedIndexPath.row) && (indexPath.section == self.selectedIndexPath.section)) { [cell setSelected:YES animated:NO]; } 

Aquí está la solución que se me ocurrió – y ni siquiera se siente hacky.

1) Implementar -scrollViewWillBeginDragging: y -scrollViewWillEndDragging:withVelocity:targetContentOffset: y resalte manualmente la celda de la fila seleccionada (si es que hay una) durante el desplazamiento.

El mío se ve así:

 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollview { self.scrollViewIsDragging = YES; if( [self.tableView indexPathForSelectedRow] ) { [[self.tableView cellForRowAtIndexPath:[self.tableView indexPathForSelectedRow]] setHighlighted:YES]; } } - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { self.scrollViewIsDragging = NO; if( [self.tableView indexPathForSelectedRow] ) { [[self.tableView cellForRowAtIndexPath:[self.tableView indexPathForSelectedRow]] setHighlighted:NO]; } } 

La propiedad scrollViewIsDragging está allí para que en -tableView:cellForRowAtIndexPath: podemos asegurarnos de que cualquier celda recién eliminada tenga el resaltado apropiado (por ejemplo, si la celda de la fila seleccionada se desplaza a la pantalla después de haber estado fuera de la pantalla). La parte pertinente de ese método se ve así:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // ... cell creation/configuration ... if( self.scrollViewIsDragging && [[tableView indexPathForSelectedRow] isEqual:indexPath]) { [cell setHighlighted:YES animated:NO]; } 

}

…Y ahí lo tienes. La celda para la Fila seleccionada permanecerá resaltada durante el desplazamiento.

UITableViewCell tiene una propiedad BOOL " seleccionada ". Cada vez que cargue la celda, verifique el estado de selección y realice la selección o deselección de la siguiente manera en la definición de cellForRowAtIndexPath:

 if (cell.selected) { // Maintain selected state } else{ // Maintain deselected state } 

Publicó una respuesta rápida a eso aquí: https://stackoverflow.com/a/35605984/3754003

En él, también explico por qué sucede esto.

Solución Swift 3, 2017

Solucioné el problema con esta simple línea de código:

 cell.isSelected = tableView.indexPathsForSelectedRows?.contains(indexPath) ?? false 

Dentro del método tableView (tableView: cellForRowAt indexPath 🙂 :

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // Dequeue a reusable cell if let cell = tableView.dequeueReusableCell(withIdentifier: "YourCellID") { cell.isSelected = tableView.indexPathsForSelectedRows?.contains(indexPath) ?? false // Now you can safely use cell.isSelected to configure the cell // ...your configurations here return cell } return UITableViewCell() }