【发布时间】:2012-03-28 12:08:36
【问题描述】:
如何使用NSPredicate 过滤数组 ivar 中的值以针对搜索查询?我设法对字符串 ivar 使用NSPredicate。我有一个名为“用户”的用户定义类,用于从地址簿创建用户。这是我的代码
// 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、其他等)条目。
如何在数组上使用谓词?任何形式的帮助表示赞赏。谢谢
【问题讨论】:
-
filteredArrayUsingPredicate:是正确的方法。上面的代码不起作用吗?您确定数组中有与谓词匹配的值吗? -
数组中有匹配谓词的值
-
尝试简化你的谓词。尝试使用一个简单的谓词过滤数组,而不是使用复合谓词。实际上,您可以尝试分别应用它们以获得 9 个单独的数组——这可能会为您提供关于问题所在的线索。
标签: iphone search nsarray filtering nspredicate