UIView在cellForRowAtIndexPath中重叠/重新创建

时间:2016-06-03 12:48:12

标签: ios objective-c uitableview uiview

我的UITableViewCell包含UIView(让我们称之为CPView),这是在调用cellForRowAtIndexPath时创建的。 CPView只是一个纯色视图,每个单元格的宽度都不同(这就是为什么需要在cellForRowAtIndexPath中创建)。

问题是

1)每次单元格加载时CPView的颜色会变暗(可能是由于每次单元格创建相同的视图,因此重叠效果)。

2)细胞重叠/继承其他细胞的CPView(我们可以看到这是因为两个CPView的浅色和深色)。

如果单元格已经存在或再次创建此CPView,如何阻止单元格重新创建?

修改

- (void)configureCell:(CreditDebitCell *)cell atIndexPath:(NSIndexPath *)indexPath {

    //other code 

      UIView * CPView;

            if (CPView){

                CPView =nil;
            }
        else
        {

        CPView = [[UIView alloc] initWithFrame:CGRectMake(cell.bounds.origin.x, cell.bounds.origin.y, cell.frame.size.width*[self.percentArray[indexPath.row] floatValue] ,cell.frame.size.height )];
        [CPView setClipsToBounds:YES];
        [CPView setBackgroundColor:[UIColor colorWithRed:107/255.0 green:15/255.0 blue:47/255.0 alpha:0.5]];

        [cell addSubview: CPView];

      }

}

3 个答案:

答案 0 :(得分:1)

这里的问题是重复使用单元格 - 因此您可以在单元格视图中添加多个视图。

你可以:

- 删除子视图 - 检查子视图是否存在并且不做任何事情。

您可以通过浏览子视图来检查子视图是否存在:

for (UIView *v in cell.contentView.subview) {
    if ([v isKindOfClass:[CPView class]]) {
        // remove or flag that it exists
    }
}

但我认为您应该在您的单元格中处理此问题 - 而不是实现表视图委托的视图控制器。最好告诉单元格使用某些视图/基于某种逻辑隐藏一些视图然后在cellForRowAtIndexPath

内执行此操作

答案 1 :(得分:0)

根据您的question(without cellforRowAtIndexpath),我可以假设您每次都应该在cellForRowAtIndexPath

中查看
  if(cpView){

       cpView = nil;
  }

  // alloc again with required size for particular row.

答案 2 :(得分:0)

制作UITableViewCell的子类,并创建一个引用CPView的属性。现在,您可以更好地控制子类化单元格是否具有需要添加的任何CPView