我有一个非常简单的NSPredicate
,它应该过滤我的自定义对象数组。
NSLog(@"%@", self.displayedSources);
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", searchText];
[self.displayedSources filterUsingPredicate:predicate];
NSLog(@"%@", self.displayedSources);
然而,这给我留下了0个结果(即使为空 searchText
)。
我知道数组中填充了26个自定义类型的对象,其中标题看起来像这样
@interface NewsSourceObject : NSObject <NSCoding>
@property (nonatomic, copy, readonly) NSString *objectId;
@property (nonatomic, copy, readonly) NSString *name;
...
@end
我知道代码正在执行,因为我在应用谓词(26 - 0)之前和之后都添加了记录数组长度的print语句。
我已经把头发拉了半天以上,因为我无法说出错误。
编辑1:
我尝试使用此description
方法为对象应用谓词(参见顶部代码块)之前和之后记录数组的内容:
- (NSString *)description {
return [NSString stringWithFormat:@"%@", self.name];
}
这就是我得到的:
2015-06-08 02:57:28.521 Newsloop[8554:1578121] (
"ABC News",
"BBC News",
"Bleacher Report",
"Business Insider",
"BuzzFeed News",
CNN,
"Daily Mail Online",
...
)
2015-06-08 02:57:28.522 Newsloop[8554:1578121] (
)
答案 0 :(得分:1)
狂野的推测,但我的理论是你在运行过滤器后没有“重置”self.displayedSources
。由于您在适当的位置过滤数组,因此错误的击键会永远清除阵列。
您可能在searchText
仍包含空字符串时运行该部分代码。这基本上从数组中删除了所有对象。每个连续的键击都在空数组上运行一个过滤器。
将过滤后的数组存储在另一个变量中:
NSLog(@"%@", self.displayedSources);
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", searchText];
NSArray *filtered = [self.displayedSources filteredArrayUsingPredicate:predicate];
NSLog(@"%@", filtered);