2012-03-28 122 views
1

如何使用NSPredicate來篩選數組ivar對搜索查詢的值?我設法對字符串伊娃使用NSPredicate。我有一個用戶定義的類,名爲「用戶」,用於從AddressBook創建用戶。這裏是我的代碼NSPredicate對抗iphone中的NSArray

// User Defined Class named as "User" 

// In User.h 

@interface User : NSObject { 

    NSString *firstName; 
    NSString *lastName; 
    NSString *company; 
    UIImage *userImage; 

    NSArray *phoneNumberArray; 
    NSArray *emailArray; 
    NSArray *urlArray; 
    NSArray *addressArray; 

    NSString *notes; 
    NSString *dateOfBirth; 
} 

// In SearchViewController.m 

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ 

    // contactsArray is NSMutableArray 
    contactsArray = [Search searchContactsWithQuery:searchText]; 
    NSLog(@"contactsArray count => %d",[contactsArray count]); 
    [contactsTableView reloadData]; 
} 

// In Search.m 

+(NSMutableArray*)searchContactsWithQuery:(NSString*)query { 

    NSLog(@"Query => %@",query); 

    NSMutableArray* predicates=[[NSMutableArray alloc] init]; 

    // Create all predicates 
    NSPredicate * firstNamePredicate = [NSPredicate predicateWithFormat:@"firstName contains %@",query]; 
    [predicates addObject:firstNamePredicate]; 
    NSPredicate * lastNamePredicate = [NSPredicate predicateWithFormat:@"lastName contains %@",query]; 
    [predicates addObject:lastNamePredicate]; 
    NSPredicate * companyPredicate = [NSPredicate predicateWithFormat:@"company contains %@",query]; 
    [predicates addObject:companyPredicate]; 

    // Don't know how to use on array 
    // === START of ARRAY Predicate ==== 

NSPredicate *phoneNoPredicate = [NSPredicate predicateWithFormat:@"phoneNumberArray IN %@",query]; 
    [predicates addObject:phoneNoPredicate]; 

    NSPredicate *emailPredicate = [NSPredicate predicateWithFormat:@"emailArray contains %@",query]; 
    [predicates addObject:emailPredicate]; 
    NSPredicate *urlPredicate = [NSPredicate predicateWithFormat:@"urlArray contains %@",query]; 
    [predicates addObject:urlPredicate]; 

    NSPredicate *addressPredicate = [NSPredicate predicateWithFormat:@"addressArray contains %@",query]; 

    // === END of ARRAY Predicate ==== 

    NSPredicate *notesPredicate = [NSPredicate predicateWithFormat:@"notes contains %@",query]; 
    [predicates addObject:notesPredicate]; 
    NSPredicate *dobPredicate = [NSPredicate predicateWithFormat:@"dateOfBirth contains %@",query]; 
    [predicates addObject:dobPredicate]; 

    // Add predicates to array 
    NSPredicate *compoundPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:predicates]; 

    NSArray * filteredArray = [APP_DELEGATE.allUsersArray filteredArrayUsingPredicate:compoundPredicate]; 

    return [NSMutableArray arrayWithArray:filteredArray]; 

} 

phoneNumberArray,emailArray,urlArray & addressArray的使用,因爲用戶可能對手機沒有,電子郵件,地址,網址像家庭,工作,iPhone,其他等

如何多個條目我可以在數組上使用謂詞嗎?任何形式的幫助表示讚賞。謝謝

+1

'filteredArrayUsingPredicate:'是正確的路要走。上面的代碼無法正常工作嗎?你確定數組中有一個與謂詞匹配的值嗎? – Caleb 2012-03-28 12:30:17

+0

數組中的值與謂詞 – iOSAppDev 2012-03-28 12:48:49

+0

相符嘗試簡化謂詞。不要使用複合謂詞,而要使用一個簡單的謂詞來過濾數組。事實上,你可以嘗試應用它們以獲得9個獨立的數組 - 這可能會讓你知道問題出在哪裏。 – Caleb 2012-03-28 12:57:05

回答

0

您正在做正確的方法,但您需要創建帶有字符串值的謂詞,而不是直接傳遞對象。

您需要使用%K,而不是%@像

[NSPredicate predicateWithFormat:@"firstName contains %k",query];

請讓我知道,如果這有助於。