无法使NSPredicate在自定义NSObject上工作

时间:2014-01-09 14:17:23

标签: ios iphone ipad cocoa-touch nspredicate

我有NSSet个名为SCPFLocation的自定义对象,我希望使用每个位置的人类可读格式(名为interpretedForm的属性)对其进行过滤。以下是我的表现:

NSMutableSet *set = [[SCPFLocation allLocations] mutableCopy];
[set filterUsingPredicate:[NSPredicate predicateWithFormat:@"interpretedForm contains[c] '%@'", searchString]];
self.matches = [set.allObjects sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    return [((SCPFLocation *)obj1).interpretedForm compare:((SCPFLocation *)obj2).interpretedForm];
}];

但我无法弄清楚为什么这不起作用。到应用谓词过滤器时,set包含零个对象。我能做错什么?

SCPFLocationSCPFValue的子类,SCPFLocation从中继承并覆盖interpretedForm属性。以下是@interface的{​​{1}}和@implementation

SCPFLocation

@interface SCPFLocation : SCPFValue @property (strong, nonatomic) NSString *province; @property (strong, nonatomic) NSString *city; @end @implementation SCPFLocation - (NSString *)interpretedForm { if (self.city) { return [NSString stringWithFormat:@"%@, %@", self.city, self.province]; } else { return self.province; } } @end

SCPFValue.h

2 个答案:

答案 0 :(得分:0)

您不必像这样在块内投射对象。我觉得这个表格更容易阅读。

NSMutableSet *set = [[SCPFLocation allLocations] mutableCopy];

[set filterUsingPredicate:[NSPredicate predicateWithFormat:@"interpretedForm contains[c] '%@'", searchString]];

self.matches = [set.allObjects sortedArrayUsingComparator:^NSComparisonResult(SCPFLocation *obj1, SCPFLocation *obj2) {
    return [obj1.interpretedForm compare:obj2.interpretedForm];
}];

说完了。那里什么都没有用。它怎么不起作用?

您能否展示一个无法正常工作的对象和搜索字符串的示例。

答案 1 :(得分:0)

自己想出来,答案非常令人沮丧。而不是以这种方式定义谓词:

[NSPredicate predicateWithFormat:@"interpretedForm contains[c] '%@'", searchString]

我是这样做的:

[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"interpretedForm contains[c] '%@'", searchString]]

和它一起工作。我不知道为什么第一种形式在Apple的Predicate Format String Syntax之后很有问题。