我无法解决这个烦人的错误。
我有一个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:应该在重用单元格时重置所有内容。
重置内容的正确方法是什么?我是否必须从超视图中删除子视图?
提前致谢
答案 0 :(得分:12)
这似乎有效。
我在CustomCell.m
- (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是初始化单元时设置的唯一重用单元标识符。