В ваших userNameLabel
и typeMessageLabel
методах вы создаете новую метку при каждом ее вызове, добавляете ее в contentView
ячейки и не удаляете старую.
Вы должны сделать так, чтобы в подклассе вашей ячейки были iVars и создать метки только один раз, а затем просто установить текст при рендеринге ячейки
- (UILabel*)userNameLabel{
if (!_userNameLabel) {
_userNameLabel = [[[UILabel alloc] init] autorelease];
_userNameLabel.tag = 107;
_userNameLabel.backgroundColor = [UIColor clearColor];
_userNameLabel.font = TTSTYLEVAR(mySubtextFont);
_userNameLabel.contentMode = UIViewContentModeLeft;
[self.contentView addSubview:_userNameLabel];
}
return _userNameLabel;
}
- (UILabel*)typeMessageLabel{
if (!_typeMessageLabel) {
_typeMessageLabel = [[[UILabel alloc] init] autorelease] ;
_typeMessageLabel.tag = 105;
_typeMessageLabel.backgroundColor = [UIColor clearColor];
_typeMessageLabel.font = TTSTYLEVAR(mySubtextFont);
_typeMessageLabel.contentMode = UIViewContentModeLeft;
[self.contentView addSubview:_typeMessageLabel];
}
return _typeMessageLabel;
}
Затем установите объект вашей ячейки в правильном месте: setObject:
метод, а не layoutSubviews
метод.Метод layoutSubviews
может быть вызван несколько раз за одно рисование и должен иметь только минимальную логику минимального позиционирования, необходимую для размещения ячеек.Настройка текста, создание элементов и другие дорогостоящие функции должны быть выключены в setObject
.
- (void)setObject:(id)object {
[super setObject:object];
…
(Do your other content-related setup here, not in layoutSubviews)
…
if ([self.username length])
_userNameLabel.text = self.username;
if ([self.typeMessage length])
_typeMessageLabel.text = self.typeMessage;
}
Затем в методе prepareForReuse
вы устанавливаете текст этих меток равным нулю.