2013-12-17 95 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'只能用於數組,集合等。 。 –