Question

Quelle est la meilleure pratique pour filtrer les données NSFetchedResultsController ? Dois-je le réinitialiser chaque fois que le texte de la barre de recherche change?

J'utilise un UISearchDisplayControllers et je l'implémente:

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

Thx.

Était-ce utile?

La solution

En quoi le code de réponse de Guy est-il différent de la question? Pour autant que je sache, la méthode filterContentForSearchText: scope est appelée par les méthodes shouldReload?

Quoi qu’il en soit, voici un code similaire que j’ai ajouté dans l’exemple de CoreDataBooks pour inclure la recherche. Ajoutez un contrôleur d'affichage de recherche dans IB pour l'exemple CoreDataBooks. Puis j'ai ajouté le code à RootViewController.m comme suit:

- (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. Pour répondre à Vivas, à l'aide d'un UISearchDisplayController, il crée automatiquement une nouvelle vue tabulaire afin de superposer la liste filtrée. Vous pouvez vérifier quelle tableView est utilisée, comme indiqué dans la documentation, mais dans la configuration la plus simple, elle fonctionne simplement car fetchedResultsController affiche une version filtrée dans la vue de table de la recherche ou toutes les données de votre vue de table.

Autres conseils

Apparemment, c’est une meilleure façon:

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

 }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top