6

Ich implementiere die Suchleiste für mein Projekt. Die Suche ist in Ordnung. Ich kann die Rohdaten anzeigen und die Daten mit dem Suchtext filtern. Wenn ich auf die Zelle des Suchergebnis-TableViews tippe, ging es nicht in die Detailansicht über. Aber für die Rohdaten kann ich in die Detailansicht wechseln. Ich verwende die Methode prepareForSegue, da ich Storyboard verwende. Hier ist der Code so weit,Suchleiste mit prepareForSegue für 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]; 
    } 
} 
} 

Wenn ich didSelectRowAtIndexPath Methode versucht, mit, ich kann in die Detailansicht wechseln. Aber ich habe Fehlermeldung wie folgt aus:

  • 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>.

Hier ist der Code für 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"); 
} 
} 

Vielen Dank für Hilfe.

Antwort

20

Das Problem ist gelöst, Ändern Sie diese in cellForRowAtIndexPath

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];

zu

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

und in der prepareForSegue Methode können Sie die self.searchDisplayController.active verwenden, um zu überprüfen die aktuelle Tabellenansicht

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

Das reparierte es für mich auch! Ich habe versucht, dieses schwer fassbare Problem für meine erste App für eine Woche oder so jetzt zu lösen! Danke für das Teilen. –

+0

'self.searchDisplayController.active' Teil hat meine Nacht gerettet !! Vielen Dank. Ich folgte diesem Tutorial und konnte es nicht funktionieren: http://www.raywenderlich.com/16873/how-to-add-search-into-a-table-view Ihre Lösung löste mein Problem. – scaryguy

+0

Danke! In meinem Fall war das Problem die Verwendung von self.tableView anstelle von 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]; 

    } 
}