UITableViewCell не обновляется должным образом - PullRequest
1 голос
/ 24 июля 2011

Я создал пользовательский UITableViewCell, но у меня проблемы с обновлением содержимого ячейки.Если в таблице несколько ячеек, таблица не отображает правильные изображения в ячейке.Изображения в каждой ячейке должны быть уникальными, однако я вижу разные ячейки с одним и тем же изображением.Кажется, в таблице размещаются ячейки случайным образом.

Я проверил мой источник данных с помощью NSLog, и имена верны.Я могу исправить проблему, когда я не использую - (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier, но вместо этого каждый раз создаю новую ячейку в - (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath.

Любое предложение о том, что я могу делать неправильно?Пожалуйста, посмотрите на мой код ниже.

- (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ScoreCell *cell = (ScoreCell *)[_tableView dequeueReusableCellWithIdentifier:@"CellID"];

    if (cell == nil) 
    {
        cell = [[[ScoreCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellID"] autorelease];
    }

    BoxScore *boxScore = [_gameDayData objectAtIndex:indexPath.row];
    [cell setScoreImage:[UIImage imageNamed:boxScore.name]];

    return cell;
}

ScoreCell.h

@interface ScoreCell : UITableViewCell
{
    UIImage *scoreImage;
}

@property(nonatomic, retain)UIImage *scoreImage;

@end

ScoreCell.m

@implementation ScoreCell

@synthesize scoreImage;

- (void)dealloc
{
    [scoreImage release], scoreImage = nil;
}


- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];

    [scoreImage drawAtPoint:CGPointMake(5,5)];
}

@end

Ответы [ 3 ]

5 голосов
/ 24 июля 2011

В дополнение к другим комментариям, обязательно реализуйте метод -prepareForReuse в вашем классе ScoreCell.Он вызывается при повторном использовании ячейки, после чего вы должны очистить изображение.Обязательно вызовите [super prepareForReuse]; в вашей реализации.Это предотвратит повторное использование ячейки с неправильным изображением.

3 голосов
/ 24 июля 2011

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

Требуется метод

- (UIImage *)boxScoreImageForIndex:(NSInteger)index 

(ленивый)загрузите, удерживайте и предоставьте изображение для ячейки.

Вы также не хотите использовать imageNamed:, в вашем случае это приведет к вдвое большему использованию памяти, чем необходимо.Вместо этого используйте imageWithContentsOfFile:.

0 голосов
/ 24 июля 2011

Вы не очищаете предыдущее изображение.Когда ячейка снята с очереди, она не освобождается.

Так что иногда изображение, которое было нарисовано на ячейке за время до того, как оно просвечивает перед новым изображением.

В drawRect вам нужно все очистить.

Либо выполните:

CGContextClearRect( context , [self bounds] );

, либо установите clearsContextBeforeDrawing в ячейке при ее создании.

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