问题描述
过滤 NSFetchedResultsController
数据的最佳做法是什么?
每当searchbar的文本改变时,我需要重新初始化它吗?
What is the best practice to filter the NSFetchedResultsController
data?do i need to re-initialize it every time the searchbar's text changes?
我使用 UISearchDisplayControllers
I am using a UISearchDisplayControllers
and i'm implementing:
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString;
Thx。
推荐答案
Guy的回答代码与问题有什么不同?就我可以猜到,filterContentForSearchText:scope方法是由shouldReload方法调用?
How is Guy's answer code any different from the question? As far as I can guess, the filterContentForSearchText:scope method is called by the shouldReload methods?
无论如何,这里是一些类似的代码,我在CoreDataBooks示例中添加包括搜索。在IB中为CoreDataBooks示例添加一个搜索显示控制器。然后我添加代码到RootViewController.m如下:
Anyway, here's some similar code that I added in the CoreDataBooks sample to include search. Add a Search Display Controller in IB for the CoreDataBooks example. Then I added code to RootViewController.m as follows:
- (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。要回答Vivas,使用UISearchDisplayController它将自动创建一个新的表视图,用于覆盖过滤的列表。你可以检查哪些tableView正在使用,如docs中所示,但在最简单的设置它只是工作,因为fetchedResultsController显示在搜索的表视图中的过滤版本或显示表视图中的所有数据。
PS. To answer Vivas, using a UISearchDisplayController it creates a new table view automatically for overlaying the filtered list. You can check which tableView is being used as shown in the docs, but in the simplest setup it just works because the fetchedResultsController is either showing a filtered version in the search's table view or showing all data in your table view.
这篇关于NSFetchedResultsController与搜索的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!