首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSPredicate与NSArray在iphone上的竞争

NSPredicate与NSArray在iphone上的竞争
EN

Stack Overflow用户
提问于 2012-03-28 20:08:36
回答 1查看 660关注 0票数 1

如何使用NSPredicate根据搜索查询过滤数组ivar中的值?我设法使用NSPredicate来对付string ivar。我有一个名为" user“的用户定义类,用于从AddressBook创建用户。以下是我的代码

代码语言:javascript
复制
  // 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,如家庭、公司、iPhone等。

如何在数组上使用谓词?任何形式的帮助都是值得感谢的。谢谢

EN

回答 1

Stack Overflow用户

发布于 2013-07-05 20:37:15

您这样做是正确的,但是您需要使用字符串值创建谓词,而不是直接传递对象。

您需要使用%k而不是%@ like

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

如果有帮助,请让我知道。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9907169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档