Пользовательский UITableViewCell не будет перерисовываться на setNeedsDisplay - PullRequest
5 голосов
/ 20 мая 2010

Я создал пользовательский класс 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 Ответ

2 голосов
/ 07 сентября 2011

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

Вы можете использовать reloadRowsAtIndexPaths: withRowAnimation: заставить таблицу перезагрузить только эту строку. См. Этот пост для получения дополнительной информации: Почему мой UITableViewCell не отменяет выбор и не обновляет его текст?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...