обновление содержимого ячейки после удаления ячеек - PullRequest
0 голосов
/ 12 октября 2010

У меня следующая проблема:

У меня есть UITableView с текстом и изображениями в качестве содержимого. TextLabel ячейки отображает текст, и я добавляю UIView с некоторыми UIImageViews в качестве его подпредставления к представлению содержимого ячеек.

Все работает нормально, пока я не удалю некоторые ячейки. Что происходит, я удаляю ячейку (скажем, первую) из таблицы, перезагружаю ее данные и, например, затем вторая клетка движется еще дальше вверх, НО! UIView справа содержит контент из первой (удаленной) ячейки.

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

Я вставлю код, чтобы сделать его понятнее.

Что я могу сделать, это выгрузить контроллер и загрузить его снова - тогда изображения снова содержат правильное содержимое ....

Вот мой код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {



static NSString *MyIdentifierUNCHECK = @"MyIdentifierUNCHECK";


MyStuff *m = [allObjects objectAtIndex:indexPath.row];
UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:MyIdentifierUNCHECK];
    UIView *v;    
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifierUNCHECK] autorelease];
        v = [[[UIView alloc] initWithFrame:CGRectMake(5.0, 5.0, 70.0, 70.0)] autorelease];

        v.contentMode = UIViewContentModeScaleAspectFill;
        [v addSubview:[[UIImageView alloc] init]];//some image view
        [cell.contentView addSubview:v];
    }

    cell.textLabel.text = m.name;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica-BoldOblique" size:14.0];
    cell.imageView.image = [UIImage imageNamed:@"checkbox.png"];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;

Ответы [ 2 ]

2 голосов
/ 12 октября 2010

Я предполагаю, что под «представлением справа» вы подразумеваете представление, которое вы создаете для своей ячейки ... Проблема здесь возникает из-за того, что вы повторно используете ячейки и не сбрасываете UIView для каждой ячейки, вы увидите то же самое Проблема возникает, если у вас достаточно клеток, чтобы вы могли прокрутить их. При повторном использовании ячеек вы всегда должны предполагать, что они содержат грязные данные, и должны загружать их правильными данными, в вашем случае ваша ошибка в следующем фрагменте:

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifierUNCHECK] autorelease];
    v = [[[UIView alloc] initWithFrame:CGRectMake(5.0, 5.0, 70.0, 70.0)] autorelease];

    v.contentMode = UIViewContentModeScaleAspectFill;
    [v addSubview:[[UIImageView alloc] init]];//some image view
    [cell.contentView addSubview:v];
}

Вы создаете экземпляр представления в ячейке только при ее первом выделении, так что это происходит ... 1- Вы делаете все свои клетки изначально и делаете их "правильный взгляд" 2- Вы удаляете ячейку 3- Для вашей второй ячейки система повторно использует UITableViewCell, который вы создали в качестве первой ячейки. 4- Поскольку ячейка не равна нулю, UIView не устанавливается, и вы видите первые ячейки UIView для второй ячейки

Поскольку вы не сбрасываете ячейки UIView, вы видите неправильный вид в ячейке вместо того, который вы ожидаете.

Чтобы исправить это, вы можете либо не использовать ячейки повторно, либо вы можете переместить код, который добавляет UIView, чтобы он происходил каждый раз, когда вызывается cellForRowAtIndexPath, таким образом правильный UIView будет загружен с правой ячейкой

0 голосов
/ 12 октября 2010

Я (к счастью :)) понял это - мне следовало взять уже существующее представление из содержимого моих ячеек ..... и обменяться им.Вот почему я пометил его в первую очередь .... это помогло мне:

    v = [cell.contentView viewWithTag:PRICE_TAG];
    for (UIView *t in v.subviews) {
        [t removeFromSuperview];
    }
    [v addSubview:[self setupPrice:m.price]];

Следует прочитать дополнительную документацию ....

...