所以伙计们,我正面临着一个我无法弄清楚的问题。我正在使用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中显示这个图像,我需要知道它是什么类型。
答案 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"];
}