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

Posted

技术标签:

【中文标题】NSPredicate 根据本地化字符串条目过滤数组【英文标题】:NSPredicate filtering an array based on a localised string entry 【发布时间】:2015-01-27 17:10:10 【问题描述】:

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

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

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

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】:

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

编辑:

你也可以使用谓词块:

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);
];

【讨论】:

是的,我不认为我想要那个。但这导致了它应该是什么的问题:) 我认为你可以做 "%K.CategoryName LIKE[cd] %@)" 但这会输出 CategoryName.CategoryName 吗?关键是 CategoryName == %K 对!我不知道 %K!你能搜索本地化的字符串键吗?在这种情况下 YELP_CAT_NAME_AIRPORTS?如果没有,您也可以使用块。查看我的编辑。 我正在寻找本地化字符串而不是键。因此,假设本地化字符串是“机场”,我想将该文本与 searchText 字符串进行比较。这就是我不知道该怎么做......块方法是否暗示了这一点,而不是在我的机器上。谢谢

以上是关于NSPredicate 根据本地化字符串条目过滤数组的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NSPredicate 通过 CoreData 中的 NSSet 属性的元素过滤对象?

使用 NSPredicate 搜索/过滤自定义类数组

使用 NSPredicate 过滤包含字典的数组数组

使用 NSPredicate 根据 NSDictionary 键过滤 NSArray

NSPredicate 根据嵌套结构中的属性过滤自定义对象

使用 NSPredicate 根据数组属性过滤 CoreData 项列表