2014-01-24 3 views
0

У меня есть UITableViewController, который дублирует строки при прокрутке вниз. Я понимаю, что ячейки повторно используются, но я просто не могу понять, что делать, чтобы исправить это. Я читал другие подобные сообщения и не мог найти решение в моем случае.UITableViewController дублирует строки?

Что я делаю неправильно в своем коде, что приводит к дублированию ячеек?

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

    if (indexPath.row == 0) { 
     cellIdentifier = @"StringTableViewCell"; 
    } else if (indexPath.row == 1) { 
     cellIdentifier = @"StringTableViewFooter"; 
    } 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    // Sets up the table view cell accordingly based around whether it is the 
    // string row or the footer 
    if (cell) { 
     if ([cell isKindOfClass:[StringTableViewCell class]]) { 
      StringTableViewCell *stringCell = (StringTableViewCell *)cell; 
      // Sets the photos to the array of photo data for the collection view 
      [stringCell setCollectionData:self.images]; 
     } else if ([cell isKindOfClass:[StringFooterTableViewCell class]]) { 
      // Sets the table view cell to be the custom footer view 
      StringFooterTableViewCell *footerCell = [[StringFooterTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"StringTableViewCellFooter"]; 

      // Init's the footer with live data from here 
      [footerCell setStringUploaderName:@"Name"]; 
      [footerCell setStringUploadDate:@"10 minutes ago"]; 
      [footerCell setStringUploaderProfileImage:[UIImage imageNamed:@"avatar.jpg"]]; 
      [footerCell setCommentButtonTitle:@"4.7k"]; 
      [footerCell setLikeButtonTitle:@"11.3k"]; 

      return footerCell; 
     } 
    } 

    return cell; 
} 
+0

вы можете показать нам свой скриншот? – chancyWu

+0

Ваш код поддерживает только две строки ячеек. Какие указательные пути должны быть для нижнего колонтитула, а какие указательные пути должны быть другого типа? – rmaddy

+0

@rmaddy indexPath.row 0 для первой ячейки, а строка 1 для нижнего колонтитула. Я установил его в прошлом, когда я специально помещал нормальную ячейку ячеек или нижнего колонтитула условно под их соответствующими строками, но никаких изменений. – Jonathan

ответ

0

Существует метод prepareForReuse для UITableViewCell, который вызывается каждый раз, когда он собирается повторно использоваться. Вы можете установить образ изображения изображения StringTableViewCell на нуль или вы можете просто сделать это в ячейке для самого indexPath, так как метод prepareForReuse рекомендуется использовать для сброса состояния (например, hightlighted или selected) для ячейки и ее подзонов ,

0

Поскольку у вас есть две разные ячейки, нужно что-то вроде этого:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.row == 0) { 
     static NSString *cellIdentifier = @"StringTableViewCell"; 
     StringTableViewCell *stringCell = (StringTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
     if (!stringCell) { 
      stringCell = [[StringTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
     } 

     [stringCell setCollectionData:self.images]; 

     return stringCell; 
    } else if (indexPath.row == 1) { 
     static NSString *cellIdentifier = @"StringTableViewFooter"; 
     StringFooterTableViewCell *footerCell = (StringFooterTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
     if (!footerCell) { 
      footerCell = [[StringFooterTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
     } 

     // Init's the footer with live data from here 
     [footerCell setStringUploaderName:@"Name"]; 
     [footerCell setStringUploadDate:@"10 minutes ago"]; 
     [footerCell setStringUploaderProfileImage:[UIImage imageNamed:@"avatar.jpg"]]; 
     [footerCell setCommentButtonTitle:@"4.7k"]; 
     [footerCell setLikeButtonTitle:@"11.3k"]; 

     return footerCell; 
    } else { 
     return nil; // this shouldn't happen but makes the compiler happy 
    } 
} 

Конечно код должен быть обновлен, чтобы показать соответствующие данные в данном разделе.

+0

Я только что внедрил код здесь, но та же проблема все еще сохраняется. Есть идеи? – Jonathan

+0

Если вы имеете в виду, что 1-я строка каждого раздела одинакова, а нижний колонтитул каждого раздела - то же самое, то прочитайте последнее предложение моего ответа. Вы жестко указываете, что каждый раздел будет идентичным. Код должен получать данные на основе 'indexPath.section', поэтому каждый раздел имеет свои собственные данные. – rmaddy

+0

Я передаю данные в каждый раздел, но это один и тот же массив изображений. Ошибка, которую я вижу, это когда я выполняю действие в ячейке. В моем случае я могу пронести через изображения в ячейке, и они двигаются. Если я прокручу вниз по таблице, поскольку эти изображения движутся в этой ячейке, я натолкнулся на другую ячейку дальше, которая будет идентичной. Изображения также будут перемещаться. Я понимаю идею размещения разных данных в разделах, но это устранит эту проблему, если я просто поместил разные изображения в каждую ячейку? – Jonathan

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