2010-10-12 2 views
0

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

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

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

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

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

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

Heres мой код:

- (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; 
+0

Do у вас есть ваша модель (allObjects) в синхронизации, т. е. соответствуют ли индексы? Возможно, также покажет код удаления. – Eiko

ответ

2

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

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

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

+0

правильный! спасибо за переформулировку этого, я действительно должен прочитать api более подробно .... – Icky

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^