2012-08-05 23 views
6

Sto implementando la barra di ricerca per il mio progetto. La parte di ricerca è ok. Posso visualizzare i dati grezzi e filtrare i dati con il testo di ricerca. Quando tocco la cella della tabella dei risultati di ricerca, non è passata alla visualizzazione dei dettagli. Ma per i dati grezzi posso passare alla visualizzazione dei dettagli. Io uso il metodo prepareForSegue mentre sto usando lo storyboard. Ecco il codice finora,Barra di ricerca con prepareForSegue per DetailViewController

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 

    if ([segue.identifier isEqualToString: @"Book Detail Segue"]) { 

    BookDetailsTVC *bookDetailsTVC = segue.destinationViewController; // for the detail view controller 
    bookDetailsTVC.delegate = self; 

    if (self.tableView == self.searchDisplayController.searchResultsTableView) { // The if block is not working 
     NSLog(@"Search Display Controller"); 
     bookDetailsTVC.book = [self.searchResults objectAtIndex: self.searchDisplayController.searchResultsTableView.indexPathForSelectedRow.row]; 
    } else { 
     NSLog(@"Default Display Controller"); 
     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
     bookDetailsTVC.book = [self.objects objectAtIndex: indexPath.row]; 
    } 
} 
} 

Quando provato ad utilizzare didSelectRowAtIndexPath metodo, posso transizione al dettaglio. Ma ho ricevuto il messaggio di errore del genere:

  • Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.

  • Unbalanced calls to begin/end appearance transitions for <BookDetailsTVC: 0x69b5300>.

Ecco il codice per didSelectRowAtIndexPath:

- (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath 
{ 
    BookDetailsTVC *bookDetailsTVC = [[BookDetailsTVC alloc] init]; 

    if (tableView == self.searchDisplayController.searchResultsTableView) { 

    bookDetailsTVC.book = [self.searchResults objectAtIndex: self.searchDisplayController.searchResultsTableView.indexPathForSelectedRow.row]; 

    [self performSegueWithIdentifier: @"Book Detail Segue" sender:self]; 

    NSLog(@"Search Display Controller"); 
} else { 

    bookDetailsTVC.book = [self.objects objectAtIndex: indexPath.row]; 

    [self performSegueWithIdentifier: @"Book Detail Segue" sender: self]; 

    NSLog(@"Default Display Controller"); 
} 
} 

Grazie per l'aiuto.

risposta

20

Il problema è risolto, Variazione questo cellForRowAtIndexPath

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];

a

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier: CellIdentifier];

e nel metodo prepareForSegue, è possibile utilizzare il self.searchDisplayController.active per controllare l'attuale tableview

if (self.searchDisplayController.active) { 
    NSLog(@"Search Display Controller"); 
    bookDetailsTVC.book = [self.searchResults objectAtIndex: self.searchDisplayController.searchResultsTableView.indexPathForSelectedRow.row]; 
} else { 
    NSLog(@"Default Display Controller"); 
    bookDetailsTVC.book = [self.objects objectAtIndex: self.tableView.indexPathForSelectedRow.row]; 
} 
+0

Questo lo ha risolto anche per me! Ho cercato di risolvere questo problema elusivo per la mia prima app per circa una settimana ora! Grazie per la condivisione. –

+0

La parte 'self.searchDisplayController.active' ha salvato la mia notte !! Grazie mille. Stavo seguendo questo tutorial e non riuscivo a farlo funzionare: http://www.raywenderlich.com/16873/how-to-add-search-into-a-table-view la tua soluzione ha risolto il mio problema. – scaryguy

+0

Grazie! Nel mio caso il problema era usare self.tableView invece di self.searchDisplayController.searchResultsTableView. – Borzh

1
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (tableView == self.searchDisplayController.searchResultsTableView) { 

     self.selectedPerson = [self.searchResults objectAtIndex:indexPath.row]; 

     PersonasDetalle *pd = [self.storyboard instantiateViewControllerWithIdentifier:@"PersonaDetalle"]; 
     pd.persona = self.selectedPerson; 

     [self.navigationController pushViewController:pd animated:YES]; 

    } 
} 
Problemi correlati