每个部分的动态行

时间:2016-07-25 13:34:04

标签: ios xcode uitableview nsarray nsdictionary

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

 <__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;
        }
)

从上面的数据中,我想要&#34; EGroupName&#34;分段中的值并动态计算每个部分的数量(在这种情况下,它是&#39; 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 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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];
}