为什么这个简单的 NSPredicate 不过滤我的数组
Why doesn't this simple NSPredicate filter my array
我有一个非常简单的 NSPredicate
,用于过滤我的自定义数组 objects。
NSLog(@"%@", self.displayedSources);
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", searchText];
[self.displayedSources filterUsingPredicate:predicate];
NSLog(@"%@", self.displayedSources);
然而,这给我留下了 0 个结果(即使 empty searchText
)。
我知道数组填充了 26 个 objects 自定义类型,其中 header 看起来像这样
@interface NewsSourceObject : NSObject <NSCoding>
@property (nonatomic, copy, readonly) NSString *objectId;
@property (nonatomic, copy, readonly) NSString *name;
...
@end
我知道代码正在执行,因为我在应用谓词 (26 - 0) 之前和之后添加了记录数组长度的打印语句。
我已经为此烦恼了半天多了,因为我不知道哪里出了问题。
编辑 1:
我尝试使用 objects:
的 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] (
)
胡思乱想,但我的理论是 "reset" self.displayedSources
在 运行 过滤器之后。由于您就地过滤数组,一次错误的击键将永远清除数组。
您可能 运行 那部分代码 searchText
仍然包含空字符串。这基本上从数组中删除了所有对象。每个连续的击键 运行s 是对空数组的一个过滤器。
改为将过滤后的数组存储在不同的变量中:
NSLog(@"%@", self.displayedSources);
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", searchText];
NSArray *filtered = [self.displayedSources filteredArrayUsingPredicate:predicate];
NSLog(@"%@", filtered);
我有一个非常简单的 NSPredicate
,用于过滤我的自定义数组 objects。
NSLog(@"%@", self.displayedSources);
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", searchText];
[self.displayedSources filterUsingPredicate:predicate];
NSLog(@"%@", self.displayedSources);
然而,这给我留下了 0 个结果(即使 empty searchText
)。
我知道数组填充了 26 个 objects 自定义类型,其中 header 看起来像这样
@interface NewsSourceObject : NSObject <NSCoding>
@property (nonatomic, copy, readonly) NSString *objectId;
@property (nonatomic, copy, readonly) NSString *name;
...
@end
我知道代码正在执行,因为我在应用谓词 (26 - 0) 之前和之后添加了记录数组长度的打印语句。
我已经为此烦恼了半天多了,因为我不知道哪里出了问题。
编辑 1: 我尝试使用 objects:
的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] (
)
胡思乱想,但我的理论是 "reset" self.displayedSources
在 运行 过滤器之后。由于您就地过滤数组,一次错误的击键将永远清除数组。
您可能 运行 那部分代码 searchText
仍然包含空字符串。这基本上从数组中删除了所有对象。每个连续的击键 运行s 是对空数组的一个过滤器。
改为将过滤后的数组存储在不同的变量中:
NSLog(@"%@", self.displayedSources);
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", searchText];
NSArray *filtered = [self.displayedSources filteredArrayUsingPredicate:predicate];
NSLog(@"%@", filtered);