NSPredicate
을 사용하여 배열 ivar의 값을 검색 쿼리에 대해 필터링 할 수 있습니까? 나는 문자열 ivar에 대해 NSPredicate
을 사용합니다. 나는 하나의 사용자 정의 클래스를 AddressBook에서 사용자를 생성하는 데 사용되는 "User"로 명명했습니다. 여기 내 코드는아이폰의 NSArray에 대한 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 & 사용자 등 다른 어떤 전화, 이메일, 주소, 가정, 직장, 아이폰과 같은 URL,
방법에 대해 여러 항목이있을 수 있으므로 addressArray가 사용된다 배열에 술어를 사용할 수 있습니까? 모든 종류의 도움을 주시면 감사하겠습니다. 감사합니다
'filteredArrayUsingPredicate :'는 올바른 방법입니다. 위 코드가 작동하지 않습니까? 술어와 일치하는 값이 배열에 있는지 확인 하시겠습니까? – Caleb
배열에 술어 – iOSAppDev
과 일치하는 값이 있습니다. 조건자를 단순화하십시오. 복합 술어를 사용하는 대신 간단한 술어 중 하나를 사용하여 배열을 필터링하십시오. 사실, 9 개의 개별 배열을 얻기 위해 각각을 적용 해 볼 수 있습니다. 그러면 문제가있는 곳의 단서를 얻을 수 있습니다. – Caleb