NSPredicate (filterContentForSearchText) if/else: searchText hasPrefix:@"#"

NSPredicate (filterContentForSearchText) if/else: searchText hasPrefix:@"#"

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope {
  if ([searchText hasPrefix:@"#"]) {
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"(def contains[c] %@)", searchText];
    searchResults = [chengduhua filteredArrayUsingPredicate:resultPredicate];
  } else {
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"(head beginswith[c] %@) OR (pro beginswith[c] %@) OR (searchableStringValue beginswith[c] %@)", searchText, searchText, searchText];
    searchResults = [chengduhua filteredArrayUsingPredicate:resultPredicate];
  }
}

我的 else 工作正常,但是任何 # 前缀搜索都变成空的。

有什么提示吗?

searchText 是我需要添加前缀的正确内容吗?!

这是我的搜索显示控制器:

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterContentForSearchText:searchString
                           scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
                                  objectAtIndex:[self.searchDisplayController.searchBar
                                                 selectedScopeButtonIndex]]];
return YES;

}

您可能会发现这可以解决问题:

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"(def contains[c] '%@')", searchText];

(注意在 %@ 两边添加了引号)

没有去掉愚蠢的前缀。

这是我的解决方案

    NSString *prefixToRemove =@"#";
    NSString *newString = [searchText copy];
    if ([searchText hasPrefix:prefixToRemove])
        newString = [searchText substringFromIndex:[prefixToRemove length]];
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"(def contains[c] %@)", newString];