2012-03-28 68 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];

请让我知道,如果这有助于。