2010-05-19 3 views
5

Я создал пользовательский класс UITableViewCell с UIButton, a UIImage и два UILabels. Кнопка и изображение накладываются друг на друга, и одновременно отображается только один. Ожидаемое поведение: вы касаетесь кнопки, кнопка исчезает и отображает изображение. UITableViewCells настроены на повторное использование. Вот мой код:Пользовательский UITableViewCell не будет перерисовываться на setNeedsDisplay

Constructor:

- (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 на все, но ничего, кажется, происходит. Если я прокручиваю экран и создаю резервную копию, кнопка скрыта, и теперь отображается значок загрузки, но это происходит только после прокрутки. Я не уверен, что мне нужно сделать, чтобы переместить ячейку.

ответ

2

UITableView делает некоторое причудливое кэширование для поддержки прокрутки и т. П .; У меня были аналогичные проблемы с обновлением определенной ячейки, когда я использую пользовательские представления.

Вы можете использовать reloadRowsAtIndexPaths: withRowAnimation: чтобы таблица перезагрузилась только этой строкой. Смотрите эту должность для получения дополнительной информации: Why won't my UITableViewCell deselect and update its text?

+0

В моем обычае UITableViewCell добавить NSIndexPath и назначить его в ячейку, а затем перерисовать ячейку, я называю это: [self.tableView reloadRowsAtIndexPaths: [NSArray arrayWithObject: currentCell.indexPath] withRowAnimation: UITableViewRowAnimationNone]; –

Смежные вопросы