2013-12-17 126 views
6

我有一个名为Contact类,它具有,除其他外,以下属性的实例的阵列的阵列,以进行搜索:使用NSPredicate通过对象

NSArray *mailAddressList // Array of NSString 
NSArray *websiteList // Array of NSString 
NSArray *tags // Array of instances of Tag class 

类标签具有以下属性:

NSString *name; 
UIColor *color; 

我想使用NSPredicate在每个Contact的任何属性中搜索字符串。这是我的代码:

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] %@", scope, textSearch]; 
} 
else 
{ 
    // The rest of the properties are instances of NSString 
    predicate = [NSPredicate predicateWithFormat:@"SELF.%@ contains[c] %@", scope, textSearch]; 
} 

一切正常,除了SCOPE_TAG细,它不返回任何值。我不认为我正确使用谓词。

注:我是新与NSPredicate所以我想听到一些见解,如果我在做什么都不行

+0

不是100%肯定是什么对你的问题负责,但你应该使用'%K'格式说明符来代替'%@'而不是'%@'。因此,例如'SCOPE_TAG'的格式字符串为'SELF。%K.name contains [c]%@“' – indragie

+0

感谢您的评论,我将它改为'%K',但行为没有改变 –

+0

难道你不想错过第二个谓词语句中的ANY吗?我想你想检查数组中是否有任何标签名称包含文本... – Alexander

回答

8

首先,如果替换成的keyPath你应该使用%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); 
+0

谢谢!它现在完美运行了,我必须之前犯了一个错误,因为我尝试使用'ANY',并且我得到了异常,并且说运算符不能被使用,因为它不是一个集合。这使我认为'ANY'只能用于数组,集合等。 。 –