2012-03-28 3 views
1

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가 사용된다 배열에 술어를 사용할 수 있습니까? 모든 종류의 도움을 주시면 감사하겠습니다. 감사합니다

+1

'filteredArrayUsingPredicate :'는 올바른 방법입니다. 위 코드가 작동하지 않습니까? 술어와 일치하는 값이 배열에 있는지 확인 하시겠습니까? – Caleb

+0

배열에 술어 – iOSAppDev

+0

과 일치하는 값이 있습니다. 조건자를 단순화하십시오. 복합 술어를 사용하는 대신 간단한 술어 중 하나를 사용하여 배열을 필터링하십시오. 사실, 9 개의 개별 배열을 얻기 위해 각각을 적용 해 볼 수 있습니다. 그러면 문제가있는 곳의 단서를 얻을 수 있습니다. – Caleb

답변

0

올바른 방법을 사용하고 있지만 개체를 ​​직접 전달하는 대신 문자열 값이있는 조건부를 만들어야합니다.

당신이 도움이 있으면 알려 주시기 바랍니다

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

같은 %의 @ 대신 %의 K를 사용해야합니다.