0

我在我的 中添加了一个自定义按钮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];
4

2 回答 2

3

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

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

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

于 2012-11-29T21:55:10.917 回答
0

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

步骤是:

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

示例代码:

-(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];
}
于 2012-11-29T22:08:13.190 回答