2012-01-31 10 views
16

Tengo un UITableViewController con un segue donde yo estoy tratando de conseguir la fila seleccionada actualmente:indexPathForSelectedRow volver nula

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
    if([[segue identifier] isEqualToString:@"EditFilterElementSegue"]){ 
     // Get the element that was clicked and pass it to the view controller for display 
     NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow]; 
     Element *element = [fetchedResultsController objectAtIndexPath:selectedIndexPath]; 
     FilterElementTableViewController *vc = segue.destinationViewController; 
     vc.filter = filter; 
     vc.element = element; 
    } 
} 

El problema es indexPathForSelectedRow vuelve nula. Los documentos dicen que se devuelve nil "si la ruta del índice no es válida". Si agrego:

 [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:YES scrollPosition:0]; 
     selectedIndexPath = [self.tableView indexPathForSelectedRow]; 

selectedIndexPath es válido. Por lo tanto, actualmente estoy asumiendo que la fila de alguna manera está siendo deseleccionada. ¿Alguien puede decirme cómo averiguar si este es el caso y qué podría estar causando?

Este código funcionó bien hasta que me convertí a usar NSFetchedResultsController (que de lo contrario está funcionando). También uso indexPathForSelectedRow en varios otros controladores de vista de tabla donde funciona bien (uno de los cuales también usa NSFetchedResultsController).

También intenté romper en didSelectRowAtIndexPath, pero sucede lo mismo allí. (Esperado ya que llama después de prepareForSegue.)

Respuesta

1

Ok, la conclusión es que la escena en el guión gráfico estaba mal.

Para resolverlo, eliminé el segue y creé una nueva clase UITableViewController vacía y solo agregué el código suficiente para poder hacer clic en una fila y mirar indexPathForSelectedRow. Todavía era nulo.

Luego creé un nuevo UITableViewController en el guión gráfico y reemplacé el existente. Ahora indexPathForSelectedRow funcionó.

Copié todo el código de clase, y las células del prototipo se terminaron, ¡y aún funcionaba!

Por curiosidad miré la fuente del guión gráfico para las dos escenas y noté que la escena que no funcionaba era mucho más larga que la nueva. Mirando el bosquejo del guión gráfico era obvio por qué, y sorprendente que funcionó en absoluto. Y, ahora recuerdo haber tenido problemas para cortar & pegando un prototipo de celda. Supongo que debería mirar el modo de esquema con más frecuencia. Ver la siguiente captura de pantalla (las escenas visuales tienen el mismo aspecto):

Storyboard screen shot

22

Una posible causa es que usted ha escrito algo en uno de los métodos UITableViewDelegate -

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
} 

Es una práctica común deselect the row que acaba de ser seleccionado.

+8

Para mí estaba deseleccionando mi fila. 'Doh! – Baub

9

estar seguros, no está realizando llamadas deselectRowAtIndexPath método antes de obtener la ruta del índice de la fila seleccionada.

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; //add this line after setting indexPath 
} 
+0

reloadData también podría llevar a deseleccionar la fila – foOg

0

También tuve este problema, cuando reemplacé a una clase UITableViewController con una clase UIViewController en el código, y no actualizó el guión gráfico es decir, que no sustituir el marcador de posición en UITableViewController guión gráfico, con un guión gráfico UIViewController.

2

Ok En mi caso, estaba llamando desde UIButton en el guión gráfico por show segue.

y extracción siguiente línea:

NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];

con por debajo de 2 líneas trabajó para mí:

CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView]; NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];

esperanza con mi caso "llamando segue de UIButton en la celda" trabaja para los demás además.

+0

wow esto es perfecto, estaba haciendo algo similar. Cuando tuve que volver a cargar una celda específica, ya que la sección cambia al desplazarse, no pude actualizar más. esto es lo que utilicé junto con su respuesta NSArray * indexPathArray = [NSArray arrayWithObject: [NSIndexPath indexPathForRow: indexPathSectionRow.row inSection: indexPathSectionRow.section]]; [self.nationalTableView reloadRowsAtIndexPaths: indexPathArray withRowAnimation: UITableViewRowAnimationFade]; –

12

Algo que puede ayudar a los demás - si llama al reloadData() en su vista de tabla, se anula el indexPathForSelectedRow.

+1

Este descubrimiento sorprendentemente simple me acaba de ahorrar un par de horas;) –

+0

gracias hermano !!! realmente ayuda – SamuelChan