从深JSON结构构建UITableView

时间:2014-08-13 00:41:18

标签: ios objective-c json uitableview

所以伙计们,我正面临着一个我无法弄清楚的问题。我正在使用UITableView来显示我正在从已转换为字典的JSON对象中收集的数据。

{
  "start_from": "2014-08-10",
  "list_tags": {
    "2014-08-12": {
      "0": [
        {
          "id": "5",
          "tag": "555"
        }
      ],
      "1": [
        {
          "id": "5",
          "tag": "556"
        }
      ],
      "-1": [
        {
          "id": "5",
          "tag": "557"
        }
      ]
    },
    "2014-08-10": {
      "0": [
        {
          "id": "5",
          "tag": "558"
        },
        {
          "id": "5",
          "tag": "565"
        },
        {
          "id": "5",
          "tag": "566"
        }
      ],
      "1": [
        {
          "id": "5",
          "tag": "559"
        }
      ],
      "-1": [
        {
          "id": "5",
          "tag": "560"
        }
      ]
    },
    "2014-08-14": {
      "0": [
        {
          "id": "5",
          "tag": "561"
        }
      ],
      "1": [
        {
          "id": "5",
          "tag": "562"
        },
        {
          "id": "5",
          "tag": "564"
        }
      ],
      "-1": [
        {
          "id": "5",
          "tag": "563"
        }
      ]
    }
  }
}

如果你看一下json结构,它就像

字典 - > list_tags - > {特定日期(许多日期之一) - > {特定阵列(三个标识符值-1,0,1之一) - > {特定对象(可以是几个)}}

我正在使用tableview,格式化日期作为标题。这里的挑战是在相同的相应标题下显示数组内的所有对象(-1,0,1)。由于每个数组内部都有多个对象,因此很难找出一个日期下存在多少个对象,因此,一个标题。

使用枚举,我获得了特定日期的对象数。

所以我的titleForHeader使用

self.listTagsKeys[section];

返回特定日期下所有数组下的对象数。

我的部分数量是

[self.listTags count];

我使用使用[Date:Number Of Rows]

映射的字典来获取行数
[self.tagsForDates valueForKey:[self.listTagsKeys objectAtIndex:section]];

我面临的挑战是如何在同一标题下显示tableview单元格的数据,因为我无法直接访问数据。

如果我这样做错了,请告诉我,以便我不会走错方向。 如果有人能告诉我如何在这种情况下使用迭代器,而不是简单地指出这可以使用迭代器来修复,或者帮助我找到一种方法来做到这一点,或者更好地组织数据,我会感到非常感激。来自JSON结构。

让我知道这是否太混乱了,所以我能够更好地解释它。

干杯!

该部分将是日期,行将是该部分下每个日期(-1,0,1)的所有对象。由于这些对象中的每一个都有一个唯一的标识符作为父对象,即-1,0,1,我不知道如何判断哪些行是某个标识符。

所以2014-08-10将有5行,但是有三个图像中的一个(一个用于-1,一个用于0,一个用于1)作为其imageview。为了能够在某个行的imageview中显示这个图像,我需要知道它是什么类型。

2 个答案:

答案 0 :(得分:1)

我首先要创建一个对象来存储section和row对象。一个简单的NSObject子类就像这样 -

MySectionObject.h:

@class MySectionObject;

@interface MySectionObject: NSObject {

@property (strong, nonatomic) NSDate *date;
@property (readonly,nonatomic) NSArray *rowData; 

-(id)initWithDate:(NSDate)date;
-(void)addRow:(MyRowObject *)row;

@end

mySectionObject.m:

@interface MySectionObject: ()

@property (strong,nonatomic) NSMutableArray *rows;

@end

@implementation MySectionObject

   -(id)initWithDate:(NSDate *)date 
   {
        if (self=[super init]) {
            _date=date;
            _rows=[NSMutableArray new];
        }

        return self;
   }

   -(void)addRow(MyRowObject *)row
   {
       [self.rows addObject:row];
   }

   -(NSArray *)rowData {
   {
       return [NSArray arrayWithArray:self.rows];
   }

@end

MyRowObject.h:

@interface MyRowObject: NSObject {

@property (strong, nonatomic) NSString *id;
@property (strong, nonatomic) NSString *tag;
@property NSInteger imageType 

-(id)initWithType:(NSInteger)type id:(NSString *)id tag:(NSString *)tag;

@end

myRowObject.m:

@implementation MyRowObject

   -(id)initWithType:(NSInteger)type id:(NSString *)id tag:(NSString *)tag
   {
        if (self=[super init]) {
            _imageType=type;
            _id=id;
            _tag=tag;
        }

        return self;
   }

@end

我已经为两个属性使用了字符串,因为我不确定它们是数字还是仅仅是您的示例数据。

然后您可以简单地枚举您的JSON以生成嵌套数组 -

self.tableData=[NSMutableArray new];   // This is a property that stores the data for your tableview
NSDictionary *listTags = [myJson objectForKey:@"list_tags"];

for (NSString *date in listTags) {

   NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

   [dateFormatter setDateFormat:@"yyyy-MM-dd"];
   NSDate *sectionDate = [dateFormatter dateFromString:date];

   MySectionObject *section=[MySectionObject alloc]initWithDate:sectionDate];

   NSDictionary *listTagDict = (NSDictionary *)[listTags objectForKey:date];

   for (NSString *imageType in listTagDict) {
       NSInteger *type=[imageTypes integerValue];
       NSArray *rows=[listTagDict objectForKey:imageType];
       for (NSDictionary *rowDict in rows) {
          NSString *id=(NSString *)[rowDict objectForKey:@"id"];
          NSString *tag=(NSString *)[rowDict objectForKey:@"tag"];
          MyRowObject *row=[MyRowObject alloc] initWithType:type id:id tag:tag]];
          [section addRow:row];
       }
   }

   [self.tableData addObject:section];
}

现在部分的数量由self.tableData.count给出,部分中每行的数量由[self.tableData objectAtIndex:sectionNumber].rowData.count

给出

您可以使用MySectionObject *s=[self.tableData objectAtIndex:sectionNumber]获取部分标题的数据,使用

获取行的值
 MySectionObject *s=[self.tableData objectAtIndex:indexPath.section];
 MyRowObject *r=[s.rowData objectAtIndex:indexPath.row];

答案 1 :(得分:0)

 -(void) ViewDidLoad
  {
     //json is the data you posted;    
     NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:[json dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableLeaves error:nil];
     NSMutableArray *datesArr = [NSMutableArray alloc]init];
     for(NSDictionary *d in [dict valueForKey:@"list_tags"])
         [datesArr addObject:d];
     NSMutableArray *endItems = [NSMutableArray alloc] init]; //list of all dates under list_tags
     NSMutableArray *rootItems = [NSMutableArray alloc] init]; //array of dictionary(id,tags)
     for(int i =0 i<[datesArr count]; i++)
     {
        [[datesArr objectAtIndex:i] enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) {
        [endItems addObject:key];
        NSArray *roots = [datesArr objectAtIndex:indexPath.row];
            [[roots objectAtIndex:i] enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) {
               [rootItems addObject:object];
            }];
        }];
     }
  }

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
  {
      return [endItems count];
  }

 -(NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
  {
     return [endItems objectAtIndex:indexPath.row];
  }

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
       for(int i=0; i<[endItems count];i++)
        {
           if(i==section)
             //i could n't analyse how to get count for each sections.. is bit complicated
        }

    }

-(UITableViewCell *) responsesTableViewConfiguration:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{ //Your Cell implementation
   Cell.title.text = [[rootItem objectAtIndex:indexPath.row] valueForKey:@"id"];
   Cell.subtitle.text = [[rootItem objectAtIndex:indexPath.row] valueForKey:@"tag"];
}