我的应用程序中有一个搜索机制,到目前为止,NSPredicate的一个对象被用来过滤对象。
我很困惑,因为魔法发生在我的程序运行时。在我的程序中,有一个具有名称的数组和另一个具有已过滤的名称声明为属性的可变数组。
@property (strong, nonatomic) NSArray *names;
@property (strong, nonatomic) NSMutableArray *filteredNames;在加载视图时,我用名称初始化数组。
self.names = @[
@"Aeron",
@"Brandon",
@"Chris",
@"David",
@"Elvis",
@"Francisco",
@"George",
@"Oliver",
@"Lary",
@"Neythan",
@"Marcus",
@"Phil"
];然后,我设置了一个表视图及其内容,安装搜索机制(使用iOS 8的一个,即UISearchController)。接下来,我实现了UISearchResultsUpdating协议,下面介绍了我的updateSearchResultsForSearchController:。
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController {
NSString *input = searchController.searchBar.text;
if (input.length > 0) {
[self.filteredNames removeAllObjects];
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
NSLog(@"Got [%@] string.", evaluatedObject);
NSRange range = [evaluatedObject rangeOfString:input options:NSCaseInsensitiveSearch];
return range.location != NSNotFound;
}];
NSArray *matches = [self.names filteredArrayUsingPredicate:predicate];
[self.filteredNames addObjectsFromArray:matches];
[((UITableViewController *)self.searchController.searchResultsController).tableView reloadData];
}
}所以它工作得很完美。但是我想知道,为什么我要在块中迭代数组中的名字呢?我知道块是好的,因为它们指定将帧从包含所有变量和特定值的堆栈中保存到过去,因此它们可以在最近执行。但是为什么这个块要迭代这个特定的数组呢?我试图声明一个新的集合并初始化它(因为我认为它接受了所有的集合和它们的值),但是它没有工作。
提前谢谢你!
发布于 2014-09-29 15:05:54
要筛选数组,必须遍历每个元素,并对谓词块进行测试。我相信你正在经历的行为是故意的。
https://stackoverflow.com/questions/26102807
复制相似问题