自定义 UITableViewCell 不会在 setNeedsDisplay 上重绘
Posted
技术标签:
【中文标题】自定义 UITableViewCell 不会在 setNeedsDisplay 上重绘【英文标题】:Custom UITableViewCell won't redraw on setNeedsDisplay 【发布时间】:2010-05-19 22:46:33 【问题描述】:我创建了一个自定义UITableViewCell
类,其中包含一个UIButton
、一个UIImage
和两个UILabels
。按钮和图像相互叠加,一次只显示一个。预期的行为是您触摸按钮,按钮消失,并显示图像。 UITableViewCells
设置为可重复使用。这是我的代码:
构造函数:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])
unheartButton = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
unheartButton.backgroundColor = [UIColor clearColor];
unheartButton.frame = CGRectMake(10, 13, 20, 18);
[unheartButton addTarget:self action:@selector(onButtonClick:) forControlEvents:UIControlEventTouchUpInside];
[unheartButton setBackgroundImage:[UIImage imageNamed:@"redheart.png"] forState:UIControlStateNormal];
imageView = [[UIImageView alloc] init];
imageView.frame = CGRectMake(12, 13, 16, 16);
NSMutableArray *array = [[NSMutableArray alloc] init];
for (int ndx = 1; ndx < 13; ndx++)
[array addObject:[UIImage imageNamed:[NSString stringWithFormat:@"icon-loading-%d (dragged).tiff", ndx]]];
imageView.animationImages = array;
imageView.animationDuration = 1;
[array release];
[self.contentView addSubview:imageView];
[self.contentView addSubview:unheartButton];
return self;
- (void) setModel:(MyModel *)myModel
model = myModel;
if (model.hideImage)
imageView.hidden = YES;
unheartButton.hidden = NO;
else
imageView.hidden = NO;
unheartButton.hidden = YES;
按钮点击:
- (IBAction) onButtonClick: (id) sender
model.hideImage = NO;
unheartButton.hidden = YES;
imageView.hidden = NO;
[imageView startAnimating];
[self setNeedsDisplay];
[self.contentView setNeedsDisplay];
[self.unheartButton setNeedsDisplay];
[self.imageView setNeedsDisplay];
我正在打电话给setNeedsDisplay
,但似乎什么也没发生。如果我滚动屏幕并返回,按钮被隐藏,现在显示加载图标,但这只会在滚动后发生。我不确定我需要做什么才能重新绘制单元格。
【问题讨论】:
【参考方案1】:UITableView 做了一些花哨的缓存来支持滚动等;当我使用自定义视图时,我在刷新特定单元格时遇到了类似的问题。
您可以使用 reloadRowsAtIndexPaths:withRowAnimation: 使表格仅重新加载该行。有关更多信息,请参阅此帖子:Why won't my UITableViewCell deselect and update its text?
【讨论】:
在我的自定义 UItableViewCell 中,我添加 NSIndexPath 并将其分配给单元格,然后重绘单元格,我称之为:[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:currentCell.indexPath] withRowAnimation:UITableViewRowAnimationNone];以上是关于自定义 UITableViewCell 不会在 setNeedsDisplay 上重绘的主要内容,如果未能解决你的问题,请参考以下文章
Datepicker 不会显示在自定义 UITableViewCell 类中
带有 canBecomeFirstResponder YES 的自定义 UITableViewCell 不会在屏幕外取消选择