2013-03-04 148 views
0

我正在一個項目中,我正在下載一大堆JSON,然後製作一個漂亮的UITableView。NSPredicate過濾NSMutableArray子NSDictionaries

我已經把JSON解析成了一個很好的NSMutableArray,然後將它提供給UITableView。一切正常,看起來很漂亮。

我遇到的問題是我的NSMutableArray中有一個字典對象,我想用它來執行tableview的過濾。

這是在的NSMutableArray對象的NSLog的,我正在看:

{ 
id = 123456; 
    issues =  (
       { 
      id = 4; 
      name = "Ape"; 
     }, 
       { 
      id = 25; 
      name = "Chimp"; 
     }, 
       { 
      id = 28; 
      name = "Human"; 
     } 
    ); 
status = open; 
} 

我想寫一個謂詞過濾器上的任何問題的名稱列的字典中的NSMutableArray 。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", @"name", @"Human"]; 
NSArray *predicateFilteredArray = [tableViewArray filteredArrayUsingPredicate:predicate]; 

但是我找不出合適的格式來匹配問題中名稱的謂詞變量。我已經閱讀並重讀了Predicate Programming指南,大約有一半的堆棧溢出項標記爲NSPredicate,我無法弄清楚語法。 我已經嘗試了很多變體的自我,我只是普通老卡住了。

+0

我的回答有幫助嗎?如果您需要更多信息,請告訴我。 – 2013-03-06 08:35:17

回答

2

如果我理解正確的問題,下面的謂語應該工作:

[NSPredicate predicateWithFormat:@"ANY issues.name == %@", @"Human"] 

這給從那裏的「問題」至少一個有一個「名字」,這等於「陣列中的所有對象人」。

+0

我試過這個解決方案,但它沒有爲我工作。你可以請檢查我做了什麼錯誤[這裏](http://stackoverflow.com/questions/26480703/filtering-nsmutablearray-of-nsdictionary-with-nspredicate)? – NAZIK 2014-10-21 07:19:43

0

我寫了一個類別方法庫,名爲Linq to ObjectiveC,這使得這種事情更容易一些。從我可以收集的信息中可以看到,有一系列物品,每個物品都有一個名爲issues的屬性,它本身就是一個數組?

如果你想找到所有已命名爲「人」的問題的項目,您可以執行以下操作:

NSArray* matches = [inputArray where:^BOOL(id item) { 
    return [[item issues] any:^BOOL(id issue) { 
     return [[issue name] equalTo:@"Human"]; 
    }]; 
}] 

它使用LINQ到的ObjectiveC whereany方法。