NSPredicate 根据本地化字符串条目过滤数组

NSPredicate filtering an array based on a localised string entry

我们有一个主 plist 文件,其中包含我们的数据源。

上面显示了根数组中的一个子字典的示例。

我想为 search/filter 类别名称创建一个 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];

我认为您的问题出在 %K.%@ 中,如果您查看最后的谓词,我相信它会在 %@ 周围加上引号,这不是您想要的(通过点符号猜测) .

编辑:

您还可以使用谓词块:

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

编辑 2:

以上谓词通过 returning 符合上述条件的任何行来工作。要执行更复杂的搜索,只需将要求的数量增加到 return 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);
}];