我有一个名为Contact的类的实例数组,其中包含以下属性:
NSArray *mailAddressList // Array of NSString NSArray *websiteList // Array of NSString NSArray *tags // Array of instances of Tag class
NSString *name; UIColor *color;
我想使用NSPredicate在每个联系人的任何属性中搜索字符串.这是我的代码:
if([scope isEqualToString:SCOPE_MAIL] || [scope isEqualToString:SCOPE_WEBSITE]) { // Search through an array predicate = [NSPredicate predicateWithFormat:@"ANY SELF.%@ contains[c] %@",scope,textSearch]; } else if([scope isEqualToString:SCOPE_TAG]) { // Search another object's property predicate = [NSPredicate predicateWithFormat:@"SELF.%@.name contains[c] %@",textSearch]; } else { // The rest of the properties are instances of NSString predicate = [NSPredicate predicateWithFormat:@"SELF.%@ contains[c] %@",textSearch]; }
一切正常,除了SCOPE_TAG,它不返回任何值.我不认为我正确使用谓词.
注意:我是NSPredicate的新手,所以如果我正在做的事情不好,我想听听一些见解
解决方法
首先,如果你替换一个键路径,你应该使用%K作为arg.
此外,我认为您在第二个查询中缺少ANY参数.如果任何标签名称包含您的textSearch,我想您想要一个结果.
为了更好地理解谓词的工作原理,请查看Apple Documentation
我做了一个快速测试,它仍然工作正常:
NSMutableArray *arrayContacts = [NSMutableArray array]; { AMContact *contact = [[AMContact alloc] init]; NSMutableArray *arrayTags = [NSMutableArray array]; { AMTags *tag = [[AMTags alloc] init]; tag.name = @"Test"; [arrayTags addObject:tag]; } { AMTags *tag = [[AMTags alloc] init]; tag.name = @"Te2st2"; [arrayTags addObject:tag]; } { AMTags *tag = [[AMTags alloc] init]; tag.name = @"No"; [arrayTags addObject:tag]; } contact.tags = [arrayTags copy]; [arrayContacts addObject:contact]; } { AMContact *contact = [[AMContact alloc] init]; NSMutableArray *arrayTags = [NSMutableArray array]; { AMTags *tag = [[AMTags alloc] init]; tag.name = @"Test"; [arrayTags addObject:tag]; } contact.tags = [arrayTags copy]; [arrayContacts addObject:contact]; } NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY SELF.%K.name contains[c] %@",@"tags",@"Test"]; NSArray *result = [arrayContacts filteredArrayUsingPredicate:pred]; NSLog(@"%@",result);