UITableViewCell当单元格可见时重新添加自定义内容

时间:2012-11-29 21:46:22

标签: ios uitableview

我在我的cell.contentView中添加了一个自定义按钮,我注意到每当一个单元格从屏幕的可见部分滚动并重新打开时,该按钮会重新添加 - 它的半透明部分变得越来越坚实。处理它的正确方法是什么,以便在滚动tableView时不会在顶部堆叠更多对象?请注意,每个单元格的自定义内容都不同,因此我无法将其放入if (cell == nil) {...}块。

我的代码是:

UISegmentedControl *btn = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:btn_title]];
// set various other properties of btn
...
[cell.contentView addSubview:btn];

2 个答案:

答案 0 :(得分:3)

每次单元格出列时,您必须先删除旧的子视图,然后才能添加新的子视图,否则您将获得该叠加效果。您可以在以下两个位置之一执行此操作:

a)在tableView:cellForRowAtIndexPath:中,在dequeueReusableCellWithIdentifier:来电之后和添加新视图之前删除旧视图。

b)如果您使用UITableViewCell的子类,则可以覆盖prepareForReuse以删除不需要的视图。每次单元格出列以便重复使用时都会调用prepareForReuse,因此它是从上次配置单元格时删除旧视图的好地方。

答案 1 :(得分:0)

我将为您发布的代码发布示例修复。它可以扩展到更多的视图。

步骤如下:

  1. 在CustomCell类中创建一个负责整个设置的方法(例如:setupWithItems:
  2. cellForRowAtIndexPath:中有一个单元格(在出列或创建单元格之后),您应该使用单元格应显示的新项目列表来调用setupWithItems:
  3. setupWithItems:实现中,请确保从其父视图中删除UISegmentedControl。您可以轻松地将分段控件存储为自定义单元格的属性。
  4. setupWithItems:实现中,创建一个新的UISegmentedControl并将其添加到CustomCell的视图层次结构中。
  5. 示例代码:

    -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
    {
        CustomCell* cell = [tableView dequeueReusableCellWithIdentifier:kSomeIdentifier];
    
        if (!cell)
        {
            // Create a new cell
        }
    
        NSArray* currentCellItems = [self cellItemsForRow:indexPath.row];
    
        [cell setupWithItems:currentCellItems];
    
        return cell;
    }
    

    在CustomCell子类中:

    - (void)setupWithItems:(NSArray*)items
    {
        if (self.segmentedControl)
        {
            [self.segmentedControl removeFromSuperView];
            self.segmentedControl = nil;
        }
    
        // More setup...
    
        UISegmentedControl *btn = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:btn_title]];
        // set various other properties of btn
    
        [cell.contentView addSubview:btn];
    }