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;
}
Dzięki że pracowała doskonale! Chociaż nadal nie rozumiem, dlaczego muszę to zrobić, gdy mój CustomCell nie ma ustawionego homeImageView w init? –
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. –
Dzięki za to. Rozumiem, w jaki sposób komórki są teraz ponownie używane –