2011-01-06 12 views
7

Mam UITableView i miałem podklasę UITableViewCell (nazywaną CustomCell), więc ma kilka etykiet i UIImageView.UITableView i Cell Reuse

Tylko niektóre komórki będą wyświetlać obraz. Oto mój kod 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; 
} 

Więc to tylko ustawia homeImageView gdy znajdzie odpowiedni wizerunek w słowniku I utworzyły. Wydaje się, że działa to w przypadku kilku pierwszych komórek, ale jeśli przewinę listę, stwierdzam, że komórki mają obraz, gdy nie powinny go mieć.

Rozumiem, że jest to prawdopodobnie spowodowane ponownym użyciem komórki, ale ustawiam homeImageView po utworzeniu/ponownym użyciu komórki ?!

Oto metoda startowych z mojego CustomCell klasy

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

Odpowiedz

14

Trzeba wyczyścić widoku obrazu, jeśli nie masz obraz na wyświetlaczu:

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

Dzięki że pracowała doskonale! Chociaż nadal nie rozumiem, dlaczego muszę to zrobić, gdy mój CustomCell nie ma ustawionego homeImageView w init? –

+6

Z powodu ponownego użycia komórki. 'dequeueReusableCellWithIdentifier' zwróci komórkę do ciebie, która była już używana. Jeśli zawierał obraz przy pierwszym użyciu, nadal będzie zawierał ten sam obraz, który teraz zostanie mu zwrócony z puli ponownego wykorzystania. Musisz więc zresetować wszystkie właściwości komórki, które mogły zostać ustawione w poprzednim cyklu. –

+0

Dzięki za to. Rozumiem, w jaki sposób komórki są teraz ponownie używane –