我正在将一个搜索栏添加到我的 iOS 应用程序的 TableView 组件中,该组件允许搜索由字典组成的 NSArray。不过,搜索栏并不总是有效 - 如果我的数据完全匹配,但不是部分匹配,它会成功打印出结果。例如,如果输入了确切的短语,它会打印出“Turn off a light”作为结果,但如果只输入“Turn”则不会。然而,在仅由字符串组成的调试数组上,搜索功能完全按照预期工作。
我的谓词代码在这里:
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", searchText];
self.searchResults = [allSearchableItems filteredArrayUsingPredicate:resultPredicate];
}
实际工作的测试 block 是这样写的:
- (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”正确打印并更新,但是在第一个 block 中,NSArray“searchResults”仅在输入精确匹配时返回结果。我在这里完全不知所措,因此非常感谢任何帮助/建议。
最佳答案
因为您正在对象中搜索字符串,所以我认为您只需要在谓词中深入挖掘即可。对象内的字符串只是该对象的部分匹配。当您在谓词中使用 SELF 时,您指定在对象本身内进行搜索,在您的例子中是一个 NSDictionary。 NSDictionary 中的字符串字段本质上是对象中的对象。因此,如果您要在字典中查找名为“Name”的字段,则不应在 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];
}
如果您仍然需要检查对象中包含的其他字段,您可以创建复合谓词。有关谓词的详细信息可以在 Apple's Predicate Programming Guide. 中找到。
希望这会有所帮助!
关于objective-c - iOS 基于 Cotains 的谓词搜索仅在找到完全匹配时返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7578281/