2011-01-06 1 views
7

У меня есть UITableView, и я подклассифицировал UITableViewCell (его называют CustomCell), поэтому он имеет несколько меток и UIImageView.UITableView и повторное использование ячеек

Только определенные ячейки фактически отображают изображение. Вот мой код tableView:cellForRowAtIndexPath::

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    Match *aMatch = [[appDelegate.matchByDate objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; 
    static NSString *CellIdentifier = @"Cell"; 


    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[CustomCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
    } 


    cell.homeLabel.text = aMatch.homeTeam; 
    cell.awayLabel.text = aMatch.awayTeam; 
    cell.timeLabel.text = aMatch.koTime; 
    cell.tournamentLabel.text = aMatch.tournament; 


    NSString *tempString = [appDelegate.teamLogos objectForKey:[aMatch homeTeam]]; 
    if (tempString!=nil) { 
     cell.homeImageView.image = [UIImage imageNamed:tempString]; 
    } 

    return cell; 
} 

Так он устанавливает только homeImageView, когда он находит соответствующее изображение в словаре я настроил. Кажется, это работает для первых нескольких ячеек, но если я прокручу список, я обнаружил, что у ячеек есть изображение, когда у них их не должно быть.

Я понимаю, это, вероятно, из-за повторного использования ячейки, но я устанавливаю homeImageView после того, как ячейка была создана/повторно использована ?!

Вот метод инициализации моего CustomCell класс

- (id)initWithStyle:(UITableViewCellStyle)style 
    reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { 
     // Initialization code 
     tournamentLabel = [[UILabel alloc] init]; 
     tournamentLabel.textAlignment = UITextAlignmentCenter; 
     tournamentLabel.font = [UIFont systemFontOfSize:12]; 
     tournamentLabel.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0]; 
     tournamentLabel.textColor = [UIColor darkGrayColor]; 
     homeLabel = [[UILabel alloc]init]; 
     homeLabel.textAlignment = UITextAlignmentLeft; 
     homeLabel.font = [UIFont systemFontOfSize:16]; 
     homeLabel.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0]; 
     awayLabel = [[UILabel alloc]init]; 
     awayLabel.textAlignment = UITextAlignmentRight; 
     awayLabel.font = [UIFont systemFontOfSize:16]; 
     awayLabel.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0]; 
     timeLabel = [[UILabel alloc]init]; 
     timeLabel.textAlignment = UITextAlignmentCenter; 
     timeLabel.font = [UIFont systemFontOfSize:30]; 
     timeLabel.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0]; 
     timeLabel.textColor = [UIColor darkGrayColor]; 
     homeImageView = [[UIImageView alloc]init]; 
     awayImageView = [[UIImageView alloc]init]; 


     [self.contentView addSubview:homeLabel]; 
     [self.contentView addSubview:awayLabel]; 
     [self.contentView addSubview:timeLabel]; 
     [self.contentView addSubview:tournamentLabel]; 
     [self.contentView addSubview:homeImageView]; 
     [self.contentView addSubview:awayImageView]; 

    } 
    return self; 
} 

ответ

14

Вы должны очистить вид изображения, если у вас нет изображений на дисплей:

... 
if (tempString!=nil) { 
    cell.homeImageView.image = [UIImage imageNamed:tempString]; 
} else { 
    cell.homeImageView.image = nil; 
} 
... 
+0

Спасибо, что работало лакомство! Хотя я все еще не понимаю, почему я должен это делать, когда у моего CustomCell нет homeImageView, установленного в init? –

+6

Из-за использования ячейки повторно. 'dequeueReusableCellWithIdentifier' вернет вам ячейку, которая уже была использована. Если в первом использовании оно содержит изображение, оно все равно будет содержать одно и то же изображение, которое будет возвращено вам из пула повторного использования. Таким образом, вы должны сбросить все свойства ячейки, которые могли быть установлены в предыдущем цикле. –

+0

Спасибо за это. Я понимаю, как клетки снова используются повторно –