iOS 基于 Cotains 的谓词搜索仅在找到完全匹配时返回
Posted
技术标签:
【中文标题】iOS 基于 Cotains 的谓词搜索仅在找到完全匹配时返回【英文标题】:iOS Cotains-based Predicate search only returns when exact match found 【发布时间】:2011-11-26 13:20:41 【问题描述】:我正在向我的 ios 应用程序的表格视图组件添加一个搜索栏,该组件允许通过由字典组成的 NSArray 进行搜索。但是,搜索栏并非一直有效 - 如果我的数据完全匹配,但不是部分匹配,它会成功打印出结果。例如,如果输入了确切的短语,它将打印出“关闭灯”作为结果,但如果只输入“转动”则不会。然而,在仅由字符串组成的调试数组上,搜索功能完全符合预期。
我的谓词代码在这里:
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", searchText];
self.searchResults = [allSearchableItems filteredArrayUsingPredicate:resultPredicate];
实际工作的测试块是这样写的:
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", searchText];
NSArray *array = [NSArray arrayWithObjects:@"Miguel", @"Ben", @"Adam", @"Melissa", nil];
NSArray *moreStuff = [array filteredArrayUsingPredicate:resultPredicate];
NSLog(@"%@", moreStuff);
self.searchResults = [allSearchableItems filteredArrayUsingPredicate:resultPredicate];
在上面的代码块中,NSArray "moreStuff" 打印出来并正确更新,但是在第一个块中,NSArray "searchResults" 仅在输入完全匹配时才返回结果。我在这里完全不知所措,因此非常感谢任何帮助/建议。
【问题讨论】:
【参考方案1】:因为您要在对象中搜索字符串,所以我认为您只需要更深入地挖掘谓词即可。对象中的字符串只是该对象的部分匹配。当您在谓词中使用 SELF 时,您指定在对象本身内搜索,在您的情况下是一个 NSDictionary。 NSDictionary 中的字符串字段本质上是对象中的对象。因此,如果您正在字典中查找名为“名称”的字段,而不是在 SELF 中查找谓词,它应该在 SELF.Name 中查找。您可以尝试以下代码来搜索 NSDictionary 的 Name 字段。
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF.Name CONTAINS[cd] %@", searchText];
self.searchResults = [allSearchableItems filteredArrayUsingPredicate:resultPredicate];
如果您仍需要检查对象中包含的其他字段,您可以创建复合谓词。关于 Predicates 的详细信息可以在Apple's Predicate Programming Guide.找到。
我希望这会有所帮助!
【讨论】:
以上是关于iOS 基于 Cotains 的谓词搜索仅在找到完全匹配时返回的主要内容,如果未能解决你的问题,请参考以下文章