Как полностью очистить ячейку при повторном ее использовании? - PullRequest
1 голос
/ 21 февраля 2012

Когда я вызываю [table reloaddata];

Ячейки перерисовываются с новыми данными, но мои UILabels запутываются, потому что они рисуются поверх старых UILabels, поэтому это беспорядок.

    static NSString* PlaceholderCellIdentifier = @"PlaceholderCell";

UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:PlaceholderCellIdentifier];


if (cell == nil)
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:PlaceholderCellIdentifier] autorelease];   
    cell.detailTextLabel.textAlignment = UITextAlignmentCenter;
    cell.selectionStyle = UITableViewCellSelectionStyleNone;


    cell.contentView.backgroundColor = [UIColor clearColor];
}

Является ли я инициатором ячейки.

Я добавляю UILabel следующим образом:

        UILabel *theDateLabel = [[UILabel alloc] initWithFrame:CGRectMake(140, 35,140, 20)];
    [theDateLabel setBackgroundColor:[UIColor clearColor]];
    [theDateLabel setTextColor:[UIColor lightGrayColor]];
    [theDateLabel setText:[dateFormatter stringFromDate:theDate]];
    [theDateLabel setFont:[UIFont fontWithName:@"TrebuchetMS-Bold" size:15]];
    [cell addSubview:theDateLabel];
    [theDateLabel release];

В ячейке есть еще несколько ярлыков, тоже самое.

Я бы хотел, чтобы старые ярлыки исчезли из ячейки, и они перестали быть видимыми.

Ответы [ 2 ]

10 голосов
/ 21 февраля 2012

Вы не должны добавлять theDateLabel как подпредставление cell. Вы должны добавить его как подпредставление cell.contentView.

Как предполагает yuji, один из способов реализовать это - создать подкласс UITableViewCell со свойством для каждого настраиваемого подпредставления. Таким образом, вы можете легко добраться до метки даты повторно используемой ячейки, чтобы установить ее текст для новой строки.

Другим распространенным подходом является использование свойства tag, которое есть у каждого UIView. Например:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString* PlaceholderCellIdentifier = @"PlaceholderCell";
    static const int DateLabelTag = 1;

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:PlaceholderCellIdentifier];
    if (!cell) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:PlaceholderCellIdentifier] autorelease];   

        UILabel *theDateLabel = [[UILabel alloc] initWithFrame:CGRectMake(140, 35,140, 20)];
        theDateLabel.tag = DateLabelTag;
        theDateLabel.backgroundColor = [UIColor clearColor];
        theDateLabel.textColor = [UIColor lightGrayColor];
        theDateLabel.font = [UIFont fontWithName:@"TrebuchetMS-Bold" size:15];
        [cell.contentView addSubview:theDateLabel];
        [theDateLabel release];
    }

    NSDate *theDate = [self dateForRowAtIndexPath:indexPath];
    UILabel *theDateLabel = [cell.contentView viewWithTag:DateLabelTag];
    theDateLabel.text = [dateFormatter stringFromDate:theDate];

    return cell;
}
5 голосов
/ 21 февраля 2012

Хотя решение Ричарда будет работать, если у ваших клеток есть какие-либо другие подпредставления, они также будут удалены. Кроме того, распределение и инициализация ваших подпредставлений каждый раз, когда вы рисуете ячейку, не обязательно оптимальны.

Стандартным решением здесь является создание подкласса UITableViewCell со свойством @dateLabel (и так далее для других меток). Затем, когда вы инициализируете ячейку, если у нее еще нет @dateLabel, вы можете дать ей новую, в противном случае вам нужно только установить ее текст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...