如何使用NSFetchedResultsController和UISearchDisplayController
我一直在使用核心数据创建一个iPhone应用程序。
首先,使用NSFetchedResultsController和UISearchDisplayController来获取结果是否合理? 你会推荐别的吗?
我一直在尝试将NSFetchedResultController和UISearchDisplayController结合起来。 我一直在考虑在(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
中设置一个NSPredicate (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
方法到UIViewController的(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
。 但是这不太好。
那么,你有没有想法如何为我的问题实施解决方案? 感谢您发布答案或指向优秀教程的链接。
编辑
这是我的代码。 UISearchDisplayDelegate方法调用方法(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
,它应该在NSFetchedResultController中设置谓词。 我还添加了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;
}
看着你的代码,它就在那里。 我遇到了使用此方法更改搜索的问题。 修复:清除缓存!
假设您按如下方式启动了您的提取结果控制器。 请注意cacheName属性。
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:[self fetchRequest] managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"UserSearch"];
在您更改谓词时,只需添加:
[NSFetchedResultsController deleteCacheWithName:@"UserSearch"];
就像魔术一样,它会很好地工作。
您还需要监视搜索显示控制器何时结束搜索并擦除谓词。
尽管此线程看起来死了,但我在谷歌上找到了它,所以也许有人会使用它。 :)
根据文档,您要么使用谓词将结果过滤到数组中,要么重新初始化fetchedResultsController。
重要提示:在初始化控制器之后,您不能修改获取请求。 例如,您不得更改谓词或排序顺序。
- NSFetchedResultsController
(我会评论闲置的答案,但我没有业力。)
这听起来像你只是对获取和显示对象感兴趣。 在这种情况下,您不使用搜索显示控制器。 搜索显示控制器与搜索栏一起使用,以帮助允许用户输入文本搜索您的内容。
通常情况下,您使用获取的结果控制器来帮助实现表视图数据源和委托方法。 此外,您还为您的抓取结果控制器创建并使用抓取请求。 这是所有的样板(参见Apple在您创建一个新项目时使用“使用核心数据进行存储”选项提供的模板代码)。
它位于获取请求中,您可以创建并指定一个谓词。 这将允许您过滤表格显示的对象。 例如:
// only fetch objects with myAttribute set to someValue
NSPredicate *pred = [NSPredicate predicateWithFormat:@"myAttribute == %@",someValue];
[fetchRequest setPredicate:pred];
链接地址: http://www.djcxy.com/p/36127.html
上一篇: How to use NSFetchedResultsController and UISearchDisplayController
下一篇: Custom sorting with NSFetchedResultController (subclassing NSSortDescriptor)