2013-06-25 108 views
0

我试图负载以下JSON文件复杂JSON资源...过滤NSArray的使用NSPredicate

{ 
    "divisions" : [ 
     { 
      "divName" : "Division Name", 
      "divList" : [ 
       { 
        "itemName" : "First item", 
        "itemVisible" : "1" 
       }, 
       { 
        "itemName" : "Second item", 
        "itemVisible" : "0" 
       }, 
       { 
        "itemName" : "Third item", 
        "itemVisible" : "0" 
       } 
      ] 
     } 
    ] 
} 

...与部分一个UITableView( “divName” 为titleForHeaderInSection, “ITEMNAME”在cell.textLabel.text中),这不是问题。我遇到的问题是根据itemVisible属性的值过滤单元格中的数据 - “0”表示隐藏,“1”表示。我最好的猜测是,应该使用NSPredicate来完成,例如...

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"itemVisible == %@", @"1"]; 
NSArray *filteredArray = [randomArrayNameOfItems filteredArrayUsingPredicate:predicate]; 

...但我不知道如何实际上一个相当复杂的JSON对象纳入本。

任何帮助或建议将不胜感激。

+0

意味着,如果itemVisible = 0,则U需要直接从表跳过此项... ? –

+0

为什么不使用JSon Parser? – DharaParekh

+0

@KumarKl正是。 – user1433391

回答

2

你为什么不把json字符串解码成对象?

NSError *e; 
NSDictionary object = [NSJSONSerialization JSONObjectWithData:op.responseData options:NSJSONReadingMutableContainers error:&e]; 

if (e) 
{ 
    TLog(@"%@ %@",[e localizedDescription],op.responseString); 
} 

if ([object isKindOfClass:[NSDictionary class]]) 
{ 
    NSArray *itemArray = object[@"divisions"][@"divList"] 
    //filter here 
} 

,如果你的情况下,你可以将电池无形的高度简单地设置为0

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //if the cell. itemVisible == 0 , return 0.0f; 
} 
+0

事实上,我使用NSJSONSerialization,但以一种稍微不同的方式 - 我创建了一个全局NSArray self.contentArray(类似于[object objectForKey:@“divisions”]),以便numberOfSectionsInTableView是[self.contentArray count],numberOfRowsInSections是[[[self.contentArray objectAtIndex:section] objectForKey:@“divList”] count] - 我想要做的,我猜想,是以某种方式过滤深度数组“divList”的元素,我不知道这应该在哪里做完了。 – user1433391

+1

我认为你不必过滤结果,你可以设置你不想要的单元格的高度0 – adali

+0

工程就像一个魅力,非常感谢你。 – user1433391