我们有一个主plist文件,其中包含我们的数据源
以上显示了根阵列中的一个子字典的示例。
我想创建一个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];
答案 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);
}];