【发布时间】:2014-01-16 00:15:42
【问题描述】:
我有一个xcdatamodeld,看起来像这样:
我有一个UISearchBar 到我的UITableView 和一个Scope,如下所示:
我添加了以下方法:
- (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)当我搜索范围为“成分”的单词时,应用程序会显示所有食谱,其成分的名称包含该单词
上图显示了名为“aglio olio pepe”和“rigatoni sale pepe”的两个食谱,其成分为 (aglio, olio, pepe) 和 (rigatoni, sale, pepe)。
第二次搜索应该显示两者。
实际效果:(1)
什么实际上不起作用:(2)
为什么?
【问题讨论】:
-
除了您的过滤方式无法很好地扩展之外,您为什么不简单地使用这样的谓词:
[NSPredicate predicateWithFormat:@"ANY ingredients.name CONTAINS[cd] %@", searchText]? -
因为我不想搜索“半”字。像“toni”或“epe”这样的搜索不应该给出任何结果(这样他们不会)。否则我已经试过你写的东西了,还是不行。
-
@iAndrew:我已经使用搜索文本“pepe”和您的数据测试了您的谓词
"ANY SELF.ingredients.name MATCHES[cd] %@",它返回了 both 个对象,正如人们所期望的那样。跨度> -
我无法理解什么不起作用,这太令人沮丧了。我意识到它显示了我添加的最后一个配方以及我正在寻找的成分
-
问题不存在,我必须查看我的项目。谢谢大家
标签: ios xcode uitableview core-data nspredicate