我在我的應用程序中有一個搜索機制,因此使用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