2012-01-24 2 views
4

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

Я создал пользовательский элемент, который выглядит так:

enter image description here

I ручка населяющий его следующим образом:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *MyIdentifier = @"Cell"; 

    TableGalleryCustomCell *cell = (TableGalleryCustomCell*)[tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 

    if(cell == nil) { 
     NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"TableGalleryCustomCell" owner:nil options:nil]; 
     for (id currentObject in topLevelObjects) { 
      if ([currentObject isKindOfClass:[UITableViewCell class]]) { 
       cell = (TableGalleryCustomCell*)currentObject; 
       break; 
      } 
     } 
    } 

    if (countingIndex < [[[self.appDelegate rssParser] rssItems] count]) { 
     cell.firstAddress.text = [[[[self.appDelegate rssParser] rssItems] objectAtIndex:countingIndex] Address]; 
     cell.firstPrice.text = [[[[self.appDelegate rssParser] rssItems] objectAtIndex:countingIndex] Deposit]; 
     if ([[[[[[self appDelegate] rssParser]rssItems]objectAtIndex:countingIndex] imageURLs] count] != 0) { 
      [cell.firstImage setImageWithURL:[NSURL URLWithString:[[[[[self.appDelegate rssParser] rssItems] objectAtIndex:countingIndex] imageURLs] objectAtIndex:0.0]]]; 
      cell.firstImage.tag = countingIndex; 
     } 
    } 

    countingIndex++; 
    if (countingIndex < [[[self.appDelegate rssParser] rssItems] count]) { 
     cell.secondAddress.text = [[[[self.appDelegate rssParser] rssItems] objectAtIndex:countingIndex] Address]; 
     cell.secondPrice.text = [[[[self.appDelegate rssParser] rssItems] objectAtIndex:countingIndex] Deposit]; 
     if ([[[[[[self appDelegate] rssParser]rssItems]objectAtIndex:countingIndex] imageURLs] count] != 0) { 
      [cell.secondImage setImageWithURL:[NSURL URLWithString:[[[[[self.appDelegate rssParser] rssItems] objectAtIndex:countingIndex] imageURLs] objectAtIndex:0.0]]]; 
      cell.secondImage.tag = countingIndex; 
     } 
    } 

    countingIndex++; 
    if (countingIndex < [[[self.appDelegate rssParser] rssItems] count]) { 
     cell.thirdAddress.text = [[[[self.appDelegate rssParser] rssItems] objectAtIndex:countingIndex] Address]; 
     cell.thirdPrice.text = [[[[self.appDelegate rssParser] rssItems] objectAtIndex:countingIndex] Deposit]; 
     if ([[[[[[self appDelegate] rssParser]rssItems]objectAtIndex:countingIndex] imageURLs] count] != 0) { 
      [cell.thirdImage setImageWithURL:[NSURL URLWithString:[[[[[self.appDelegate rssParser] rssItems] objectAtIndex:countingIndex] imageURLs] objectAtIndex:0.0]]]; 
      cell.thirdImage.tag = countingIndex; 
     } 
    } 

    countingIndex++; 
    if (countingIndex < [[[self.appDelegate rssParser] rssItems] count]) { 
     cell.fourthAddress.text = [[[[self.appDelegate rssParser] rssItems] objectAtIndex:countingIndex] Address]; 
     cell.fourthPrice.text = [[[[self.appDelegate rssParser] rssItems] objectAtIndex:countingIndex] Deposit]; 
     if ([[[[[[self appDelegate] rssParser]rssItems]objectAtIndex:countingIndex] imageURLs] count] != 0) { 
      [cell.fourthImage setImageWithURL:[NSURL URLWithString:[[[[[self.appDelegate rssParser] rssItems] objectAtIndex:countingIndex] imageURLs] objectAtIndex:0.0]]]; 
      cell.fourthImage.tag = countingIndex; 
     } 
    } 

    countingIndex++; 


    return cell; 
} 

Это немного грязное, но это работает ..... пока я не прокручу. После загрузки изображения, затем прокручивается экран, изображение исчезает.

Я полагаю, что это может быть связано с тем, что изображение изображений потеряно?

Я пробовал точно такую ​​же реализацию, но только с 1 изображением в каждой ячейке, и все отлично работает.

Любая точка в правильном направлении была бы очень оценена.

Я ценю любую помощь и благодарю вас за ваше время.

ответ

2

Я считаю, что проблема связана с тем, что ваши ячейки перегружены, и вы заполняете ячейки в tableView:cellForRowAtIndexPath:, используя информацию о строке, отличную от indexPath.row.

Может быть, попробовать что-то по следующим направлениям:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSArray   * rssItems; 
    id    rssItem; 
    static NSString * MyIdentifier = @"Cell"; 

    TableGalleryCustomCell *cell = (TableGalleryCustomCell*)[tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 

    if(cell == nil) { 
     NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"TableGalleryCustomCell" owner:nil options:nil]; 
     for (id currentObject in topLevelObjects) { 
      if ([currentObject isKindOfClass:[UITableViewCell class]]) { 
       cell = (TableGalleryCustomCell*)currentObject; 
       break; 
      } 
     } 
    } 

    rssItems = [[self.appDelegate rssParser] rssItems]; 
    if (indexPath.row < [rssItems count]) { 
     rssItem = [rssItems objectAtIndex:indexPath.row]; 
     cell.firstAddress.text = [rssItem Address]; 
     cell.firstPrice.text = [rssItem Deposit]; 
     if ([[rssItem imageURLs] count] != 0) { 
      [cell.firstImage setImageWithURL:[NSURL URLWithString:[[rssItem imageURLs] objectAtIndex:0.0]]]; 
      cell.firstImage.tag = indexPath.row; 
     } 
    } 

    return cell; 
} 
+0

благодарит за ваш ответ! Можете ли вы рассказать о «заполнении ячеек в таблицеView: cellForRowAtIndexPath: использование информации о строках, отличной от indexPath.row»?? Я думаю, что сталкиваюсь с той же проблемой и делаю то, что вы предлагаете. 10x! –

+1

Когда вы прокручиваете вверх и вниз по таблицеView, indexPath.row будет соответственно увеличивать или уменьшать. Однако ваш код только увеличивается. Например, когда таблица загружается, строка запрашиваемых ячеек может быть 0, 1, 2 и 3. Если я прокручу вниз по двум ячейкам, тогда будут запрошены строки 4 и 5 (и, наоборот, ячейки 0 и 1 будут поставлены в очередь для последующего использования). Если я снова вернусь назад, а ячейки 1 и 0 будут запрошены, а ячейки 5 и 4 будут поставлены в очередь. В исходном коде с тем же сценарием будут загружены ячейки 0, 1, 2 и 3. Затем ячейки 4 и 5. Наконец 6 и 7. –

+0

Предоставляли каждой ячейке свой собственный идентификатор с избыточным объемом памяти? – random

3

Разделяя мой опыт:

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

Проблема для меня заключалась в том, что я деактивировал ячейки, давая им все те же «уникальные» идентификаторы. Таким образом, несколько таблиц разделяли один и тот же идентификатор, и я считаю, что они конфликтуют и испортили ячейки, на которые я смотрел.

Предоставление каждой таблицы собственного уникального идентификатора решило проблему для меня. (dah!)

+1

Может ли каждая ячейка вызвать неэффективное использование памяти? – random

+0

Ну, это каждая ячейка * типа *, поэтому это звучит как попадание в парадигму. –

+0

Oded. Это очень интересно. У меня похожая проблема. Я создал таблицу для каждой буквы в алфавите на одном экране, и теперь я понимаю, что я дал каждой таблице тот же самый идентификатор. Изображения не исчезают сразу, но через некоторое время, когда я прокручиваю вверх, все изображения теряются. Текст остается, но когда я нажимаю на UITableViewCell, приложение падает. Как я могу дать каждой таблице другой идентификатор? –

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