UITableViewCell - 如何在重用之前重置内容

时间:2015-07-13 05:55:27

标签: ios objective-c uitableview

我无法解决这个烦人的错误。

我有一个CustomCell,其中我有一个子视图,根据对象的值改变它的颜色。

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

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

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

    MyObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];

    if ([object.redColor isEqualToNumber:[NSNumber numberWithBool:YES]]) {
        cell.colorView.backgroundColor = [UIColor redColor];
    }
    else {
        cell.colorView.backgroundColor = [UIColor clearColor];
    }       

    return cell;
}

除非我从tableview中删除带redColor = YES的行,否则这一切都正常,我滚动显示不可见的行。变为可见的第一行(重用可重用单元格的第一行)具有红色,即使该行为redColor = NO。如果我再次滚动并隐藏单元格然后再次显示它,颜色将设置为clearColor,它应该是它的样式。

我认为这是因为它正在重复使用刚删除的单元格。 所以我在重用之前尝试重置单元格的内容。 在CustomCell.m

- (void)prepareForReuse {
    [super prepareForReuse];

    self.clearsContextBeforeDrawing = YES;
    self.contentView.clearsContextBeforeDrawing = YES;
    self.colorView.backgroundColor = [UIColor clearColor];
}

但这不起作用。 Apple Doc说

  

tableView中的表视图委托:cellForRowAtIndexPath:应该在重用单元格时重置所有内容。

重置内容的正确方法是什么?我是否必须从超视图中删除子视图?

提前致谢

4 个答案:

答案 0 :(得分:12)

这似乎有效。

我在CustomCell.m

中的prepareForReuse时删除了单元格的contentView
- (void)prepareForReuse {
    [super prepareForReuse];

    // Clear contentView
    BOOL hasContentView = [self.subviews containsObject:self.contentView];    
    if (hasContentView) {
        [self.contentView removeFromSuperview];
    }
}

cellForRowAtIndexPath

中再次添加
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    // Cell
    static NSString *cellIdentifier = @"CustomCell";

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

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

    // Restore contentView
    BOOL hasContentView = [cell.subviews containsObject:cell.contentView];
    if (!hasContentView) {
        [cell addSubview:cell.contentView];
    }

    // Configure cell
    MyObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];

    if ([object.redColor isEqualToNumber:[NSNumber numberWithBool:YES]]) {
        cell.colorView.backgroundColor = [UIColor redColor];
    }
    else {
        cell.colorView.backgroundColor = [UIColor clearColor];
    }       

    return cell;
}

希望这会对某人有所帮助。

答案 1 :(得分:0)

您可以使用此tableview委托方法更改可见性(例如背景颜色),但不能更改数据:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

答案 2 :(得分:0)

        - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
        {
            NSString *cellIdentifier = [NSString stringWithFormat:@"CustomCell %ld",(long)indexPath.row];


            CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
            cell = nil;

            if (cell == nil)
            {
                cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];


                MyObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];

                if ([object.redColor isEqualToNumber:[NSNumber numberWithBool:YES]]) 
                {
                    cell.colorView.backgroundColor = [UIColor redColor];
                }
                else
                {
                    cell.colorView.backgroundColor = [UIColor clearColor];
                }


            return cell;
        }

答案 3 :(得分:0)

如果要从重用单元格列表中删除所有单元格,请使用:

[tblView setValue:nil forKey:@"_reusableTableCells"]

如果要从重用单元格列表中删除单个单元格,请使用:

NSString* cellID = [NSString stringWithFormat:@"cellID%ld%ld",(long)indexPath.section,(long)indexPath.row];
        NSMutableDictionary *temp1 = (NSMutableDictionary*)[tblView valueForKey:@"_reusableTableCells"];
        [temp1 removeObjectForKey:cellID];
        [tblView setValue:temp1 forKey:@"_reusableTableCells"];

其中cellID是初始化单元时设置的唯一重用单元标识符。