Frage

Was ist die beste Praxis, die NSFetchedResultsController Daten zu filtern? brauche ich, um es den Textänderungen des searchbar jedes Mal neu zu initialisieren?

Ich bin mit einem UISearchDisplayControllers und ich bin die Umsetzung:

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString;

Thx.

War es hilfreich?

Lösung

Wie ist Guy Antwort Code anders von der Frage? Soweit ich erraten kann, die filterContentForSearchText: Umfang das Verfahren durch die shouldReload Methoden aufgerufen wird

Wie auch immer, hier einige ähnlichen Code, den ich in der CoreDataBooks Probe hinzugefügt Suche einbezogen werden. Fügen Sie eine Suche Display-Controller in IB für das CoreDataBooks Beispiel. Dann habe ich den Code zu RootViewController.m wie folgt:

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
 NSInteger searchOption = controller.searchBar.selectedScopeButtonIndex;
 return [self searchDisplayController:controller shouldReloadTableForSearchString:searchString searchScope:searchOption];
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
 NSString* searchString = controller.searchBar.text;
 return [self searchDisplayController:controller shouldReloadTableForSearchString:searchString searchScope:searchOption];
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString*)searchString searchScope:(NSInteger)searchOption {

 NSPredicate *predicate = nil;
 if ([searchString length])
  if (searchOption == 0) // full text, in my implementation.  Other scope button titles are "Author", "Title"
   predicate = [NSPredicate predicateWithFormat:@"title contains[cd] %@ OR author contains[cd] %@", searchString, searchString];
  else
   // docs say keys are case insensitive, but apparently not so.
   predicate = [NSPredicate predicateWithFormat:@"%K contains[cd] %@", [[controller.searchBar.scopeButtonTitles objectAtIndex:searchOption] lowercaseString], searchString];
 [fetchedResultsController.fetchRequest setPredicate:predicate];

    NSError *error = nil;
    if (![[self fetchedResultsController] performFetch:&error]) {
  NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
  abort();
    }           

 return YES;
}

PS. Zur Beantwortung Vivas, einen UISearchDisplayController mit ihm Ansicht automatisch eine neue Tabelle erstellt zum Umlegen der gefilterten Liste. Sie können überprüfen, welche Tableview verwendet wird, wie in der Dokumentation gezeigt, aber im einfachsten Setup funktioniert es nur, weil die fetchedResultsController sind entweder eine gefilterte Version in der Suche der Tabellenansicht, oder alle Daten in Ihrer Tabellenansicht zeigen.

Andere Tipps

appearantly ist dies eine bessere Art und Weise:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    self.savedSearchTerm = searchText;

    freshData = NO;
    if (searchText !=nil)
    {
            NSPredicate *predicate =[NSPredicate predicateWithFormat:@"name contains[cd] %@", searchText];
            [fetchedResultsController.fetchRequest setPredicate:predicate];
    }
    else
    {
            NSPredicate *predicate =[NSPredicate predicateWithFormat:@"All"];
            [fetchedResultsController.fetchRequest setPredicate:predicate];
    }

    NSError *error = nil;
    if (![[self fetchedResultsController] performFetch:&error]) {
            // Handle error
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            exit(-1);  // Fail
    }           

    [self.tableView reloadData];

    //    [searchBar resignFirstResponder];   
    //    [_shadeView setAlpha:0.0f];

 }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top