текст массовой метки после просмотра таблицы прокрутки - PullRequest
0 голосов
/ 03 сентября 2011

У меня есть такая таблица:

before drag table

через несколько раз перетащите для просмотра таблицы прокрутки, которая ему нравится:

after drag table several times

Я подклассифицировал TTTableMessageItemCell и в классе подклассов я добавил это:

- (void)prepareForReuse {
    [super prepareForReuse];
    _timeLabel.text = nil;
    _timeLabel = nil;
    self.commentTime = nil;
}

но не работает ... что не так?


- (void)layoutSubviews {


    [super layoutSubviews];
    self.backgroundColor = TTSTYLEVAR(tableCellColor1);


    CGSize userNameSize = [self.username sizeWithFont:TTSTYLEVAR(mySubtextFont)];


    if (self.username != nil && self.username.length){

        self.userNameLabel.text = self.username;


        self.userNameLabel.frame = CGRectMake(self.imageView2.right + 5.f, self.imageView2.top, userNameSize.width, userNameSize.height);
    }else{
        self.userNameLabel.frame = CGRectZero;

    }


self.titleLabel.width, captionSize.height);
    if (self.typeMessage != nil && self.typeMessage.length){

        self.typeMessageLabel.text = self.typeMessage;

        self.typeMessageLabel.frame = CGRectMake(self.imageView2.right + userNameSize.width + 5.f, kTableCellSmallMargin, self.contentView.width - self.imageView2.right - userNameSize.height - 5.f, userNameSize.height);
    }else{
        self.typeMessageLabel.frame = CGRectZero;
    }
}


- (UILabel*)userNameLabel{
    if (self.username != nil && self.username.length) {
        _userNameLabel = [[[UILabel alloc] init] autorelease] ;
        _userNameLabel.tag = 107;
        _userNameLabel.backgroundColor = [UIColor clearColor];


        _userNameLabel.font = TTSTYLEVAR(mySubtextFont);
        _userNameLabel.contentMode = UIViewContentModeLeft;
        //        _typeMessageLabel.enabled = NO;
        //        [_typeMessageLabel sizeToFit];
        [self.contentView addSubview:_userNameLabel];
        _userNameLabel =  (UILabel *)[self.contentView viewWithTag:107];
    }
    return _userNameLabel;
}

- (UILabel*)typeMessageLabel{
    if (self.typeMessage != nil && self.typeMessage.length) {
        _typeMessageLabel = [[[UILabel alloc] init] autorelease] ;
        _typeMessageLabel.tag = 105;
        _typeMessageLabel.backgroundColor = [UIColor clearColor];


        _typeMessageLabel.font = TTSTYLEVAR(mySubtextFont);
        _typeMessageLabel.contentMode = UIViewContentModeLeft;
//        _typeMessageLabel.enabled = NO;
//        [_typeMessageLabel sizeToFit];
        [self.contentView addSubview:_typeMessageLabel];
        _typeMessageLabel =  (UILabel *)[self.contentView viewWithTag:105];
    }
    return _typeMessageLabel;
}

1 Ответ

1 голос
/ 04 сентября 2011

В ваших 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 вы устанавливаете текст этих меток равным нулю.

...