2012-01-31 14 views
16

Ho un UITableViewController con un segue in cui sto cercando di ottenere la riga attualmente selezionata:indexPathForSelectedRow ritorno nullo

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

Il problema è indexPathForSelectedRow sta tornando a zero. I documenti dicono che nil viene restituito "se il percorso dell'indice non è valido". Se aggiungo:

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

selectedIndexPath è valido. Quindi, attualmente sto assumendo che la riga sia in qualche modo non selezionata. Qualcuno può dirmi come capire se questo è il caso e cosa potrebbe causarlo?

Questo codice ha funzionato bene fino a quando non sono stato convertito in NSFetchedResultsController (che altrimenti funziona). Io uso anche indexPathForSelectedRow in molti altri controller di visualizzazione tabella dove funziona bene (uno dei quali usa anche NSFetchedResultsController).

Ho anche provato a spezzare didSelectRowAtIndexPath, ma la stessa cosa accade lì. (Previsto dal momento che è chiamato dopo prepareForSegue.)

risposta

1

Ok, la linea di fondo è la scena nello storyboard era incasinato.

Per capirlo ho rimosso il seguito e creato una nuova classe UITableViewController vuota e ho aggiunto solo abbastanza codice in modo da poter fare clic su una riga e guardare indexPathForSelectedRow. Era ancora zero.

Ho quindi creato un nuovo UITableViewController nello storyboard e sostituito quello esistente. Ora indexPathForSelectedRow ha funzionato.

Ho copiato tutto il codice di classe e le celle del prototipo e ha funzionato!

Per curiosità, ho guardato la fonte dello storyboard per le due scene e ho notato che la scena che non funzionava era molto più lunga della nuova. Guardando il profilo dello storyboard era ovvio il perché, e sorprendendolo funzionava del tutto. E ora ricordo di aver avuto problemi a tagliare & incollando una cella prototipo. Suppongo che dovrei guardare più spesso alla modalità struttura. Vedere la schermata di seguito (le scene visive hanno lo stesso aspetto):

Storyboard screen shot

22

Una possibile causa è che hai scritto qualcosa in uno dei UITableViewDelegate metodi -

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

E 'una pratica comune deselect the row che è stato appena selezionato.

+8

Per me stavo deselezionando la mia riga. 'Doh! – Baub

9

essere sicuro, che non sta chiamando deselectRowAtIndexPath metodo prima di ottenere il percorso indice della riga selezionata.

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

reloadData potrebbe anche portare a deselezionare la riga – foOg

0

Ho anche avuto questo problema, quando ho sostituito una classe UITableViewController con una classe UIViewController nel codice, e non aggiorno lo storyboard cioè non ho sostituire il segnaposto UITableViewController in storyboard, con uno storyboard UIViewController.

2

Ok Nel mio caso, stavo chiamando da UIButton in storyboard per show segue.

e la rimozione seguente riga:

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

con sotto 2 linee ha lavorato per me:

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

speranza con il mio caso "chiamata segue da UIButton su CELL" lavora per gli altri anche.

+0

wow questo è perfetto, stavo facendo qualcosa di simile. Dove ho dovuto ricaricare una cella specifica, ma dal momento che la sezione cambia durante lo scorrimento non ho potuto aggiornare più. ecco cosa ho usato insieme alla tua risposta NSArray * indexPathArray = [NSArray arrayWithObject: [NSIndexPath indexPathForRow: indexPathSectionRow.row inSection: indexPathSectionRow.section]]; [self.nationalTableView reloadRowsAtIndexPaths: indexPathArray withRowAnimation: UITableViewRowAnimationFade]; –

12

Qualcosa che possa aiutare gli altri - se chiami reloadData() sulla tua vista tabella, nilifica lo indexPathForSelectedRow.

+1

Questa scoperta sorprendentemente semplice mi ha appena salvato un paio d'ore;) –

+0

grazie bro !!! aiuta davvero – SamuelChan

Problemi correlati