2014-09-29 50 views
0

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

因此,它的工作原理非常完美。但我想知道,爲什麼我會在塊內使用名稱來迭代我的數組?我知道塊是好的,因爲它們規定了從棧中保存幀的過程中所有變量和特定值,因此它們可以在最近執行。但爲什麼塊迭代這個特定的數組?我試圖聲明一個新的並初始化它(因爲我認爲它花了所有的集合和它們的值),但它不起作用。

預先感謝您!

+1

對不起,我不知道我理解你的問題。 「爲什麼塊重複這個特定的數組?」你的意思是'self.names'數組?這是因爲你正在運行它的過濾功能。當你試圖「初始化一個新的」,然後你說它不起作用。你用什麼代碼來做到這一點,以及**具體是什麼**都不起作用?即它做了什麼等等......「它不起作用」是對可想象的問題的最不有用的分析。 – Fogmeister 2014-09-29 15:10:56

+0

謝謝!我需要一雙新的眼睛! :-D – Majotron 2014-09-29 15:23:50

回答

2

要過濾數組,您必須迭代每個元素並對謂詞塊進行測試。我相信你正在經歷的行爲是有意的。

+0

是的,我認爲我發送了一封郵件,並想知道數據的來源。 :-D – Majotron 2014-09-29 15:25:43

相關問題