2016-07-25 74 views
1

如何计算每个部分的行数并填充其数据。以下是数据。每个部分的动态行

<__NSCFArray 0x7fadb3e73a60>(
    { 
     AMID = ""; 
     AMName = "xyz"; 
     records =  (
        { 
       EId = 100; 
       EMName = "abc"; 
       EName = "Ename1"; 
      } 
     ); 
     EGroupId = 001; 
     EGroupName = "SectionName1"; 
     stat = G; 
    }, 

    { 
     AMID = ""; 
     AMName = "zyx"; 
     records =  (
        { 
       EId = 144; 
       EMName = "namename"; 
       EName = "somestring"; 
      }, 
        { 
       EId = 159; 
       EMName = "somestring"; 
       EName = "somestring"; 
      }, 
        { 
       EId = 161; 
       EMName = "somestring"; 
       EName = "somestring"; 
      } 

    ); 
      EGroupId = 86; 
      EGroupName = "SectionName2"; 
      stat = Y; 
     } 
) 

从以上数据,我想在节中的“EGroupName”值并且动态地计数每个部分的numberofrowsinsection(在这种情况下,它的“SectionName1和SectionName2)。 最终输出应该是这样的,

**SectionName1** 
    return 1; 
**SectionName2** 
    return 3; 

真的很感谢你的帮助。

编辑

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    NSString *selectedEngagementGroupId = engagementGroupDataArray[indexPath.section][@"EngagementGroupId"]; 
    NSString *selectedEngagementId = modelItem[@"EId"]; 
    NSLog(@"EGId %@",selectedEngagementGroupId); 
    NSLog(@"EId %@",selectedEngagementId); 

} 

回答

2

的阵列,一旦被转换成对象将是字典的阵列,其中每个字典包含一个数组,每一个包含一个字符串值,该值可以用作部分名称。这对于多节表格视图来说是一个非常好的数据源。

解析JSON后,你就会有一个目标C集合,称之为:

NSArray *parsedObject; 

段的号码是:

parsedObject.count; 

一节在indexPath标题是:

parsedObject[indexPath.section][@"EGroupName"] 

行中的区段数是:

NSArray *sectionArray = parsedObject[section][@"records"]; 
[sectionArray count] 

在给定的indexPath型号产品:

NSArray *sectionArray = parsedObject[indexPath.section][@"records"]; 
sectionArray[indexPath.row]; 

编辑去得更深一些,部分阵列本身是字典的数组,所以......

NSArray *sectionArray = parsedObject[indexPath.section][@"records"]; 
NSDictionary *modelItem = sectionArray[indexPath.row]; 

NSNumber *itemId = modelItem[@"EId"]; 
NSNumber *itemEMName = modelItem[@"EMName"]; 
NSNumber *itemName = modelItem[@"EName"]; 

// if the table cell is a just a vanilla UITableViewCell... 
cell.textLabel.text = itemName; 
cell.detailTextLabel.text = itemEMName; 

再次编辑 请记住,您的所有数据源代码必须遵循此模式,因此要从数据中获取段级属性...

NSString *engagementGroupString = engagementGroupDataArray[section][@"EGroupName"]; 
NSString *engagementManagerString = engagementGroupDataArray[section][@"AMName"]; 

编辑一而再,再 您可能会发现它烦人键入所有的东西出每个需要它的时候得到模型项目。如果是这样,你可以通过创建一个辅助函数像压缩的东西:现在

- (NSDictionary *)modelItemForIndexPath:(NSIndexPath *):indexPath { 
    NSArray *sectionArray = parsedObject[indexPath.section][@"records"]; 
    return sectionArray[indexPath.row]; 
} 

,例如,当用户选择的东西:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *selectedEngagementGroupId = engagementGroupDataArray[indexPath.section][@"EngagementGroupId"]; 
    NSDictionary *modelItem = [self modelItemForIndexPath:indexPath]; 
    NSString *selectedEngagementId = modelItem[@"EId"]; 
    NSLog(@"EGId %@",selectedEngagementGroupId); 
    NSLog(@"EId %@",selectedEngagementId); 
} 
+0

我得到每个部分的正确行数。如何显示每个行详细的“EName”作为标题和“EMName”? – user3310076

+0

@ user3310076 - 从OP中的数据看来,记录数组是一个字典数组,请参阅编辑以了解如何处理这些数据。 – danh

+0

应用程序在滚动表时崩溃。由于未捕获异常'NSRangeException',原因:' - [__ NSCFArray objectAtIndex:]:index(11)超出界限(11),终止应用程序。我将在答案框中发布我的代码。请让我知道我做错了什么。 – user3310076

1

我假设你知道如何来转换成JSON Objective-C的集合(你会得到一个顶级的数组对象我认为;但是你不显示顶级对象,这是不合法的JSON)。

您将需要创建一个NSMutableDictionary属性来保存您的数据,关键将是部分名称,值将是关联的records数组。

@property NSMutableDictionary *_sections; 

但是一个复杂的是,字典不维持秩序顺序与UITableView非常重要的,所以你需要在一个单独的阵列,以保存订单:

@property NSMutableArray *_sectionNames; 

分配他们解码JSON然后在其中存储数据的代码位:

NSArray *arrayFromJson = ...; 
for (NSDictionary *dict in arrayFromJson) { 
    NSString *sectionName = dict[@"EGroupName"]; 
    [_sections setObject:dict[@"records"] forKey:sectionName]; 
    [_sectionNames addObject:sectionName]; 
} 

如果要对节例如,按字母顺序排列,然后按照您的喜好简单分类_sectionNames(为读者练习)。

然后是UITableDataSource方法将是这样的:

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    NSString *sectioName = _sectionNames[section]; 
    return [_sections[sectionName] count]; 
} 
+0

感谢。但是,我得到“没有可见的@interface for nsmutabledictionary声明选择器addObject”错误。我已经更新了从webservice收到的实际数据 – user3310076

+0

@danh谢谢;纠正。 – Droppy

+0

@ user3310076我有错误的方法名称。 – Droppy

相关问题