自定义 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 不会在屏幕外取消选择

自定义 UITableViewCell 不显示文本字段

自定义 UITableViewCell 编辑动画

自定义 UITableViewCell 图像直到滚动才显示

使用 UIButton 自定义 UITableViewCell:无法更改 UIImage