UITableView与节重复单元格

时间:2014-09-14 09:46:04

标签: ios objective-c uitableview

我正在尝试将节标题添加到我的UITableView中。我能够正确地创建各个部分并计算每个部分中的元素数量,但是当我调用我的cellForRowAtIndexPath方法时,该表会重复两个部分中的数据。

这是我准备UITableView部分内容的地方:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    int sections = 0;
    if (sectionOneCount>0) {
        sections++;
    }

    if (sectionTwoCount>0) {
        sections++;
    }
    return sections;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (section==0) {
        return sectionOneCount;
    }
    else {
        return sectionTwoCount;
    }
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    if(section == 0) {
        return @"Section One Title";
    }
    else {
        return @"Section Two Title";
    }
}

这是我的cellForRowAtIndexPath方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"MainCell";

    ProfileTableViewCell *cell = [mainTableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[ProfileTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    cell.label1.text = [[items objectAtIndex:indexPath.row] valueForKey:@"label1"];
    cell.label2.text = [[items objectAtIndex:indexPath.row] valueForKey:@"label2"];

    return cell;
}

关于我在这里做错了什么的想法?谢谢!

P.S。以下是我正在使用的一些示例数据。我只有两个可能的部分,每种类型一个(在这种情况下,红色和蓝色)。我有一个名为items的主数组(正如你在我的cellForRowAtIndexPath方法中看到的那样)。

{
    "parentArray": {
        "id": 5,
        "items": [
            {
                "type": "red",
                "title": "RedItem1"
            },
            {
                "type": "red",
                "title": "RedItem2"
            },
            {
                "type": "blue",
                "title": "BlueItem1"
            },
            {
                "type": "blue",
                "title": "BlueItem2"
            },
            {
                "type": "blue",
                "title": "BlueItem3"
            }
        ]
    }
}

1 个答案:

答案 0 :(得分:4)

继续使用您的逻辑...

假设您的sectionOneCountsectionTwoCount正确并且顺序正确,您可以使用sectionOneCount作为填充第2部分内容的偏移量。

示例:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"MainCell";

    ProfileTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(indexPath.section == 0) {
        cell.label1.text = items[indexPath.row][@"label1"];
        cell.label2.text = items[indexPath.row][@"label2"];
    }
    else if (indexPath.section == 1) {
        cell.label1.text = items[indexPath.row + sectionOneCount][@"label1"];
        cell.label2.text = items[indexPath.row + sectionOneCount][@"label2"];
    }

    return  cell;
}

PS:使用情节提要时,您不需要if (cell == nil)


另外...

假设您的items看起来像

{
  "items": [// array of sections
    [//array of section 1 items
      {
        "type": "red",
        "title": "redItem1"
      },
      {
        "type": "red",
        "title": "redItem2"
      }
    ],
    [// array of section 2 items
      {
        "type": "blue",
        "title": "blueItem1"
      },
      {
        "type": "blue",
        "title": "blueItem2"
      },
      {
        "type": "blue",
        "title": "blueItem3"
      }
    ]
  ]
}

基本上:

{
  "items": [//array of 2 things
    [ /*array of all redItems*/ ],
    [ /*array of all blueItems*/ ]
  ]
}

这将是:

  1. 可扩展,您可以轻松添加新的greenItems数组和更多
  2. 删除对sectionCount变量的任何依赖
  3. 内部颜色项目的顺序无关紧要
  4. 而且......你的主要代表方法就是:

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        return items.count;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [items[section]].count;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"MainCell";
    
        UITableView *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
        //no need for if-else anymore as the following is dynamic enough
    
        cell.label1.text = items[indexPath.section][indexPath.row][@"label1"];
        cell.label2.text = items[indexPath.section][indexPath.row][@"label2"];
    
        return  cell;
    }
    

    PS:即使您使用更多部分更新数据源,也不需要触及此代码。