Перезагрузка UILabels TableViewCell в динамической таблице - PullRequest
0 голосов
/ 20 февраля 2012

Я получил приложение с UITableView.

В каждой UITableViewCell есть UILabel. Я добавляю ярлыки следующим образом:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  //look at the upd
}

Но когда я пытаюсь перезагрузить данные в этой таблице с некоторой другой информацией, старая информация (старые метки) не исчезает, но все еще в ячейках.

Это выглядит так: ...

Как мне организовать добавление UILabels?

UPD

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Recent Dream";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

        UILabel *textLabel = [[UILabel alloc] init];
        textLabel.frame = CGRectMake(10, 0, self.view.frame.size.width -110, 48);
        textLabel.backgroundColor = [UIColor clearColor];
        textLabel.font = [UIFont boldSystemFontOfSize:16];
        [textLabel setTag:(int)indexPath];
        [cell.contentView addSubview:textLabel];


    }
    // Configure the cell...

    Dream *tempDream = [self.dreams objectAtIndex:indexPath.row];

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"MM/dd/yyyy"];

    //Optionally for time zone converstions
    [formatter setTimeZone:[NSTimeZone timeZoneWithName:@"..."]];

    NSString *stringFromDate = [formatter stringFromDate:tempDream.dateAdd];

    UIColor *background = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"bodyWrapper.png"]];

    cell.contentView.backgroundColor = background;

    UILabel *textLabel = (UILabel *)[cell viewWithTag:(int)indexPath];
    textLabel.text = tempDream.title;

    NSLog(@"%@",tempDream.title);
    NSLog(@"%@",textLabel.text);

    cell.textLabel.text = @"";
    cell.detailTextLabel.text = stringFromDate;

    return cell;
}

И вывод выглядит так:

2012-02-20 15:58:10.512 DreamerIOS[3037:10403] lllooooonggg dreeeeeeeaaaaammmm yeeeeeeah
2012-02-20 15:58:10.513 DreamerIOS[3037:10403] (null)
2012-02-20 15:58:10.516 DreamerIOS[3037:10403] dream to end
2012-02-20 15:58:10.516 DreamerIOS[3037:10403] (null)
2012-02-20 15:58:10.519 DreamerIOS[3037:10403] adsfhadskgh dfagfadkuy gadyv dsfdfad fsdf a ghfncdhg hjfg f dfj ghf 
2012-02-20 15:58:10.519 DreamerIOS[3037:10403] (null)

Итак, NSLog (@ "% @", tempDream.title); все в порядке, но NSLog (@ "% @", textLabel.text); нулевой. Почему?

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Это потому, что вы неправильно используете ячейку табличного представления.Вы должны создать метки в следующем блоке кодаif (cell == nil) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

1 голос
/ 20 февраля 2012

Это потому, что каждый раз, когда вы добавляете новую метку в ячейку.

Когда вы создаете новую ячейку, вы добавляете метку и присваиваете ей тег

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    //  add label here
    ...
    [label setTag:999];
}

Затемкогда вы настраиваете ячейку, используйте [UIView viewWithTag:], чтобы получить ссылку на метку

UILabel *label = (UILabel *)[cell.contentView viewWithTag:999];

update:

Вы должны использовать постоянное значение для тега.Если вы используете indexPath в качестве тега, представление может не быть найдено.Поскольку вы повторно используете ячейку, система создает только определенное количество ячеек.Когда ячейка не видна (не видна), dequeueReusableCellWithIdentifier получит ячейку для вас, а не создаст новую ячейку.

reusableCell - это представление, которое вы создали ранее.Случай, в котором вы используете динамическое значение для тега, будет выглядеть следующим образом: вы находитесь в ячейке 10 (indexPath), система находит reusableCell, который создается в 3 (indexPath).Так как он был создан в 3, тег label равен 3. Но вы найдете представление с тегом 10, поэтому результат равен нулю.

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