【问题标题】:NSPredicate against NSArray in iphoneNSPredicate 针对 NSArray 在 iphone
【发布时间】: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


【解决方案1】:

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

你需要使用 %k 而不是像 %@ 这样的

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

如果这有帮助,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    相关资源
    最近更新 更多