【问题标题】:Core Data to-many relationship filterContentForSearchText with NSPredicate带有 NSPredicate 的核心数据对多关系 filterContentForSearchText
【发布时间】: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


【解决方案1】:

xcdatamodeled解决问题

【讨论】:

    猜你喜欢
    • 2011-02-18
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多