2015-07-13 5 views
6

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

У меня есть CustomCell, и в нем у меня есть subview, который меняет цвет по значению объекта.

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

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; 

    if (cell == nil) {   
     cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
    } 

    MyObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath]; 

    if ([object.redColor isEqualToNumber:[NSNumber numberWithBool:YES]]) { 
     cell.colorView.backgroundColor = [UIColor redColor]; 
    } 
    else { 
     cell.colorView.backgroundColor = [UIColor clearColor]; 
    }  

    return cell; 
} 

Это все работает нормально, за исключением того, когда я удалить строку с redColor = YES из Tableview, и я перечисляю, чтобы показать те строки, которые не было видно. Первая строка, которая становится видимой (первая строка, которая повторно использует повторно используемую ячейку), имеет красный цвет, хотя эта строка - redColor = NO. И если я снова прокручу и скрою ячейку, а затем снова ее покажу, цвет будет установлен на clearColor, как и должно быть.

Я думаю, это потому, что он повторно использует только что удаленную ячейку. Итак, я пытаюсь сбросить содержимое ячейки до повторного использования. В CustomCell.m

- (void)prepareForReuse { 
    [super prepareForReuse]; 

    self.clearsContextBeforeDrawing = YES; 
    self.contentView.clearsContextBeforeDrawing = YES; 
    self.colorView.backgroundColor = [UIColor clearColor]; 
} 

Но это не работает. Apple, Док говорит делегат

табличного представления в Tableview: cellForRowAtIndexPath: всегда должен сбросить все содержимое при повторном использовании ячейки.

Каков правильный способ сброса содержимого? Нужно ли мне удалять subviews из супервизора?

Заранее спасибо

+0

Hello @SFF проверить мой ответ. ,,, –

ответ

8

Это похоже на работу.

я удалить contentView ячейки при prepareForReuse в CustomCell.m

- (void)prepareForReuse { 
    [super prepareForReuse]; 

    // Clear contentView 
    BOOL hasContentView = [self.subviews containsObject:self.contentView];  
    if (hasContentView) { 
     [self.contentView removeFromSuperview]; 
    } 
} 

Добавьте его снова в cellForRowAtIndexPath

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

    // Cell 
    static NSString *cellIdentifier = @"CustomCell"; 

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; 

    if (cell == nil) {   
     cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
    } 

    // Restore contentView 
    BOOL hasContentView = [cell.subviews containsObject:cell.contentView]; 
    if (!hasContentView) { 
     [cell addSubview:cell.contentView]; 
    } 

    // Configure cell 
    MyObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath]; 

    if ([object.redColor isEqualToNumber:[NSNumber numberWithBool:YES]]) { 
     cell.colorView.backgroundColor = [UIColor redColor]; 
    } 
    else { 
     cell.colorView.backgroundColor = [UIColor clearColor]; 
    }  

    return cell; 
} 

Надеется, что это поможет кому-то.

+0

не слишком ли дорогостоящий ресурс? И это не «многоразовый»? –

0

Вы можете использовать этот Tableview метод делегата для изменения видимости (например, цвет фона), но не данные:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
+0

Я попытался установить цвет в 'willDisplayCell', но это тот же результат. Он не очищает старый контент повторно используемой ячейки ... – SFF

+0

Можете ли вы попробовать добавить [cell.contentView setNeedsDisplay]; перед возвратом Ячейка; –

+0

hmm, я пробовал вызывать '[cell.contentView setNeedsDisplay];' но все еще не работает ... Я также пробовал '[cell.contentView layoutIfNeeded];' но не повезло :( – SFF

0
 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
     { 
      NSString *cellIdentifier = [NSString stringWithFormat:@"CustomCell %ld",(long)indexPath.row]; 


      CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
      cell = nil; 

      if (cell == nil) 
      { 
       cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 


       MyObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath]; 

       if ([object.redColor isEqualToNumber:[NSNumber numberWithBool:YES]]) 
       { 
        cell.colorView.backgroundColor = [UIColor redColor]; 
       } 
       else 
       { 
        cell.colorView.backgroundColor = [UIColor clearColor]; 
       } 


      return cell; 
     } 
+0

Вы уверены, что это правильный код ?? Почему вы меняете cellIdentifier в соответствии с indexpath? Также устанавливаем cell = nil до того, как cell == nil не работает ни ..... Спасибо за вашу помощь, хотя ... – SFF

+0

У меня была такая же проблема раньше. :) –

+0

Я пробовал, но он сбой приложения, потому что cellIdentifier ошибочен. А также, если я устанавливаю cell = nil, он делает все ячейки пустыми. – SFF

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