我在我的应用程序中有一个搜索机制,因此使用NSPredicate
的对象来过滤对象。NSPredicate with block - 它是如何工作的
我很困惑,因为我的程序运行时发生了奇迹。在我的程序中,有一个名称为数组,另一个可变数组,声明为属性的过滤名称。
@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];
}
}
因此,它的工作原理非常完美。但我想知道,为什么我会在块内使用名称来迭代我的数组?我知道块是好的,因为它们规定了从栈中保存帧的过程中所有变量和特定值,因此它们可以在最近执行。但为什么块迭代这个特定的数组?我试图声明一个新的并初始化它(因为我认为它花了所有的集合和它们的值),但它不起作用。
预先感谢您!
对不起,我不知道我理解你的问题。 “为什么块重复这个特定的数组?”你的意思是'self.names'数组?这是因为你正在运行它的过滤功能。当你试图“初始化一个新的”,然后你说它不起作用。你用什么代码来做到这一点,以及**具体是什么**都不起作用?即它做了什么等等......“它不起作用”是对可想象的问题的最不有用的分析。 – Fogmeister 2014-09-29 15:10:56
谢谢!我需要一双新的眼睛! :-D – Majotron 2014-09-29 15:23:50