Comment est le code de réponse de Guy différente de la question? Pour autant que je puisse le deviner, la méthode filterContentForSearchText: scope est appelée par les méthodes shouldReload?
De toute façon, voici un code similaire que j'ai ajouté dans l'exemple 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, en utilisant un UISearchDisplayController, il crée automatiquement une nouvelle vue de table pour superposer la liste filtrée. Vous pouvez vérifier quelle tableView est utilisée comme indiqué dans les docs, mais dans la configuration la plus simple, cela fonctionne simplement parce que fetchedResultsController affiche une version filtrée dans la vue tableau de la recherche ou affiche toutes les données dans votre vue tabulaire.
Comment avez-vous fini par gérer les méthodes de source de données de vue table afin que la vue de table sache ou non afficher la «liste filtrée»? – CraigH
La réponse ici est très très utile http://stackoverflow.com/questions/4471289/how-to-filter-nsfetchedresultscontroller-coredata-with-uisearchdisplaycontroll/4481896#4481896 – acecapades
Voici ce que j'ai fait: http: // stackoverflow .com/questions/4471289/comment-filtrer-nsfetchedresultscontroller-coredata-avec-uisearchdisplaycontrolle/4856118 # 4856118 –