我在我的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];
答案 0 :(得分:3)
每次单元格出列时,您必须先删除旧的子视图,然后才能添加新的子视图,否则您将获得该叠加效果。您可以在以下两个位置之一执行此操作:
a)在tableView:cellForRowAtIndexPath:
中,在dequeueReusableCellWithIdentifier:
来电之后和添加新视图之前删除旧视图。
b)如果您使用UITableViewCell
的子类,则可以覆盖prepareForReuse
以删除不需要的视图。每次单元格出列以便重复使用时都会调用prepareForReuse
,因此它是从上次配置单元格时删除旧视图的好地方。
答案 1 :(得分:0)
我将为您发布的代码发布示例修复。它可以扩展到更多的视图。
步骤如下:
setupWithItems:
)cellForRowAtIndexPath:
中有一个单元格(在出列或创建单元格之后),您应该使用单元格应显示的新项目列表来调用setupWithItems:
。setupWithItems:
实现中,请确保从其父视图中删除UISegmentedControl。您可以轻松地将分段控件存储为自定义单元格的属性。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];
}