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 属性的元素过滤对象?