2011-01-06 9 views
7

Ich habe eine UITableView und ich habe UITableViewCell (genannt CustomCell) subclassed, so dass es mehrere Etiketten und eine UIImageView hat.UITableView und Cell Reuse

Nur bestimmte Zellen zeigen tatsächlich ein Bild an. Hier ist mein Code für 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; 
} 

So ist es nur die homeImageView setzt, wenn es ein entsprechendes Bild in einem Wörterbuch findet habe ich eingerichtet. Dies scheint für die ersten paar Zellen zu funktionieren, aber wenn ich durch die Liste scrolle, finde ich, dass Zellen ein Bild haben, wenn sie keins haben sollten.

Ich verstehe, dass dies wahrscheinlich wegen der Zelle wieder verwendet wird, aber ich setze die homeImageView, nachdem die Zelle erstellt/wiederverwendet wurde ?!

Hier ist die init-Methode von meinem CustomCell Klasse

- (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; 
} 

Antwort

14

Sie haben die Bildansicht löschen, wenn Sie kein Bild auf Anzeige haben:

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

Dank, die eine Behandlung funktionierte! Obwohl ich immer noch nicht verstehe, warum ich das tun muss, wenn meine CustomCell keine initeimage-Datei gesetzt hat? –

+6

Wegen der Wiederverwendung von Zellen. 'dequeueReusableCellWithIdentifier' gibt eine Zelle zurück, die bereits verwendet wurde. Wenn es bei der ersten Verwendung ein Bild enthielt, enthält es immer noch das gleiche Bild, das nun aus dem Wiederverwendungspool an Sie zurückgegeben wird. Sie müssen also alle Eigenschaften der Zelle zurücksetzen, die möglicherweise in einem vorherigen Zyklus gesetzt wurden. –

+0

Danke dafür. Ich verstehe, wie die Zellen jetzt wiederverwendet werden –