NSPredicate基于本地化的字符串条目过滤数组

时间:2015-01-27 17:10:11

标签: ios nsarray nsdictionary nspredicate nslocalizedstring

我们有一个主plist文件,其中包含我们的数据源 enter image description here

以上显示了根阵列中的一个子字典的示例。

我想创建一个NSPredicate来搜索/过滤类别名称。但不是plist中的值,因为这是一个本地化的字符串键。例如,当使用它时,我们使用:

cell.categoryNameLabel.text = NSLocalizedString([cellData objectForKey:@"CategoryName"], nil);

我有一个适用于搜索字词的NSPredicate,但也希望更新以查看本地化字符串值,这也是可能的。

我试图将其转换为nslocalizedstring方法,但它似乎不起作用:

NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@"(%K.%@ LIKE[cd] %@)",@"CategoryName",NSLocalizedString(@"YELP_CAT_NAME_AIRPORTS", nil), searchText];

1 个答案:

答案 0 :(得分:2)

我认为你的问题在%K。%@中,如果你看一下最终的谓词,我相信它会在%@周围加上引号,这不是你想要的(用点符号猜测)。 / p>

修改

您还可以使用谓词块:

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    return [NSLocalizedString(evaluatedObject[@"CategoryName"],nil) isEqualToString:@"searchString"];
}];

编辑2:

上述谓词通过返回符合上述条件的任何行来工作。要执行更复杂的搜索,只需增加要求的数量即可返回true。例如,如果您想查看“CategoryName”中的本地化字符串是包含字符串还是等于字符串,您可以执行以下操作:

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    NSString *localizedText = NSLocalizedString(evaluatedObject[@"CategoryName"],nil);
    BOOL perfectMatch = [localizedText isEqualToString:@"searchString"];
    BOOL containsString = [localizedText rangeOfString:@"searchString"].location !=NSNotFound;
    return (perfectMatch || containsString);
}];