обновление содержимого ячейки после удаления ячеек

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

У меня есть 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;

person Icky    schedule 12.10.2010    source источник
comment
У вас синхронизирована ваша модель (allObjects), то есть совпадают ли индексы? Может быть, показать код удаления, а также.   -  person Eiko    schedule 12.10.2010


Ответы (2)


Я предполагаю, что под «видом справа» вы имеете в виду представление, которое вы создаете для своей ячейки... Проблема здесь возникает из-за того, что вы повторно используете ячейки и не сбрасываете 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 будет загружаться с правильной ячейкой.

person Daniel    schedule 12.10.2010
comment
правильный! спасибо за переформулировку, мне действительно нужно более внимательно прочитать API.... - person Icky; 12.10.2010

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

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

Следует читать больше документации....

person Icky    schedule 12.10.2010