Comment utiliser NSFetchedResultsController et UISearchDisplayController
J'ai été la création d'une Application iPhone à l'aide de Données de Base.
Tout d'abord, est-il judicieux d'utiliser un NSFetchedResultsController et un UISearchDisplayController ensemble pour aller chercher le résultat? Recommanderiez-vous autre chose?
J'ai essayé assez longtemps combinant une NSFetchedResultController et un UISearchDisplayController. J'ai l'intention de créer un NSPredicate dans le (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
méthode à la NSFetchedResultController de la UIViewController. Mais cela ne fonctionne pas bien.
Alors, avez-vous une idée de comment mettre en œuvre une solution pour mon problème? Je vous remercie déjà pour l'affichage des réponses ou des liens vers de bons tutoriels.
MODIFIER
Voici mon code. Le UISearchDisplayDelegate méthodes d'appeler la méthode (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
qui doit définir le prédicat de la NSFetchedResultController. J'ai aussi ajouté le code de la NSFetchedResultController.
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterContentForSearchText:searchString scope:
[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
//Return YES to cause the search result table view to be reloaded.
return YES;
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
{
[self filterContentForSearchText:[self.searchDisplayController.searchBar text] scope:
[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];
//Return YES to cause the search result table view to be reloaded.
return YES;
}
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
NSString *query = self.searchDisplayController.searchBar.text;
if (query && query.length) {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Name contains[cd] %@", query];
[fetchedResultsController.fetchRequest setPredicate:predicate];
}
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
//Handle error
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); //Fail
}
}
- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController != nil) {
return fetchedResultsController;
}
/*
Set up the fetched results controller.
*/
//Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
//Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
//Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];
//Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
//Edit the section name key path and cache name if appropriate.
//nil for section name key path means "no sections".
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
[aFetchedResultsController release];
[fetchRequest release];
[sortDescriptor release];
[sortDescriptors release];
return fetchedResultsController;
}
source d'informationauteur burki
Vous devez vous connecter pour publier un commentaire.
Jetant un coup d'oeil à votre code, de son droit. J'ai couru dans des problèmes à l'aide de cette méthode de modification de la recherche. La solution: Effacer votre cache!
Dire que vous avez lancé votre extraites résultat contrôleur comme suit. Remarque le cacheName propriété.
Que vous changez de prédicat, il suffit d'ajouter:
Comme par magie, il fonctionnent bien.
Vous aurez également à surveiller lors de la recherche de contrôleur d'affichage mettra fin à sa recherche, et essuyez vos prédicat.
Bien que ce fil semble morte, je l'ai trouvé sur google, donc peut-être que quelqu'un va obtenir l'utilisation de ce. 🙂
Selon les docs, vous aurez voulez filtrer les résultats dans un tableau à l'aide d'un prédicat ou réinitialiser le fetchedResultsController.
(J'avais commentaire sur l'inactivité de la réponse, mais je suis karma-moins.)
Il semble que vous êtes juste intéressé par la récupération et l'affichage des objets. Dans ce cas, vous n'utilisez PAS une recherche de contrôle de l'affichage. La recherche de contrôleur d'affichage est utilisé avec une barre de recherche pour aider avec l'utilisateur en lui permettant entré recherches de texte de votre contenu.
Vous utilisez, généralement un récupérés résultats contrôleur à l'aide de la mise en œuvre de la vue de la table de source de données et délégué méthodes. Aussi, vous pouvez créer et utiliser une demande de récupération pour votre extraites des résultats de contrôleur. C'est tout de chaudière-plaque (voir le modèle de code fourni par Apple lorsque vous créez un nouveau projet avec "l'Utilisation de Base de Données pour le stockage" option sélectionnée).
C'est à la demande de récupération que vous pouvez créer et modifier un prédicat. Cela vous permettra de filtrer les objets que votre table s'affiche. Par exemple: