[英]Core Data to-many relationship filterContentForSearchText with NSPredicate
我有一个xcdatamodeld
看起来像这样:
我有一个像这样的Scope
到我的UITableView
UISearchBar
:
我添加了以下方法:
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope{
[searchResults removeAllObjects];
if ([scope isEqualToString:@"Name"]){
NSString *matchString = [NSString stringWithFormat: @".*\\b%@.*",searchText];
NSString *predicateString = @"SELF.name MATCHES[cd] %@";
NSPredicate *predicate =[NSPredicate predicateWithFormat: predicateString, matchString];
searchResults = [NSMutableArray arrayWithArray:[[self.fetchedResultsController fetchedObjects] filteredArrayUsingPredicate:predicate]];
}
if ([scope isEqualToString:@"Ingredient"]){
NSString *matchString = [NSString stringWithFormat: @".*\\b%@.*",searchText];
NSString *predicateString = @"ANY SELF.ingredients.name MATCHES[cd] %@";
NSPredicate *predicate =[NSPredicate predicateWithFormat: predicateString, matchString];
searchResults = [NSMutableArray arrayWithArray:[[self.fetchedResultsController fetchedObjects] filteredArrayUsingPredicate:predicate]];
}
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{
[self filterContentForSearchText:searchString scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
return YES;
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption{
[self filterContentForSearchText:[self.searchDisplayController.searchBar text] scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
return YES;
}
- (void)viewDidLoad {
searchResults = [NSMutableArray arrayWithCapacity:[[fetchedResultsController fetchedObjects] count]];
}
我想要的是:
(1)当我搜索范围为“名称”的单词时,应用程序会显示所有包含该单词的配方
(2)当我搜索范围为“ Ingredient”的单词时,该应用程序将显示所有包含其名称包含该单词的成分的食谱
上面的图片显示了两个配方,名称分别为“ aglio olio pepe”和“ rigatoni sale pepe”,以及成分(aglio,olio,pepe)和(rigatoni,sale,pepe)。
第二次搜索应同时显示两者。
实际有效的方法:(1)
实际不起作用的是:(2)
为什么?
更改xcdatamodeled
解决了问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.