NSP предикат против NSArray в iphone - PullRequest
1 голос
/ 28 марта 2012

Как я могу использовать NSPredicate для фильтрации значений из массива ivar по поисковому запросу? Мне удается использовать NSPredicate против строки Ивара. У меня есть один пользовательский класс с именем «Пользователь», который используется для создания пользователя из AddressBook. Вот мой код

  // 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 используются потому, что у пользователя может быть несколько записей для номера телефона, адреса электронной почты, адреса, URL-адреса, таких как HOME, WORK, iPhone, Other и т. Д.

Как я могу использовать предикаты в массиве? Любая помощь приветствуется. Спасибо

1 Ответ

0 голосов
/ 05 июля 2013

Вы делаете правильный путь, но вам нужно создавать предикаты со значениями String, а не передавать объекты напрямую.

Вам нужно использовать% k вместо% @, как

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

Пожалуйста, дайте мне знать, если это поможет.

...