2015-07-13 22 views
6

Düzeltemediğim rahatsız edici bir hata var.UITableViewCell - yeniden kullanmadan önce içeriğin nasıl sıfırlanacağı

CustomCell var ve içinde nesnenin değerine göre rengini değiştiren bir alt görüm var.

- (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; 
} 

Bu benim tableview gelen redColor = YES içeren bir satır silmek ve ben görünür değildi satırları göstermek için kayar dışında tüm çalışma gayet iyi. Görünür hale gelen ilk satır (yeniden kullanılabilir hücreyi yeniden kullanan ilk satır), bu satır redColor = NO olsa bile kırmızı renge sahiptir. Tekrar kaydırıp hücreyi gizleyip tekrar gösterirsem, renk, olması gerektiği şekilde clearColor olarak ayarlanır.

Bunun nedeni, silinmiş olan hücreyi yeniden kullanmasıdır. Bu nedenle, yeniden kullanmadan önce hücre içeriğini sıfırlamaya çalışıyorum.

- (void)prepareForReuse { 
    [super prepareForReuse]; 

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

CustomCell.m yılında Ama bu olmuyor. cellForRowAtIndexPath: bir hücreyi yeniden kullanırken her zaman tüm içeriği sıfırlamak gerekir Elma Doc tableView

tablo görünümün temsilci diyor.

İçeriği sıfırlamanın uygun yolu nedir? Süper görüntülemeden alt görüntülemeleri kaldırmak zorunda mıyım? Sen (örneğin arka plan rengi için) görünürlüğünü ancak verileri değiştirmek için bu tableview temsilci yöntemi kullanabilirsiniz peşin

+0

Merhaba @SFF cevabımı kontrol edin. ,,, –

cevap

8

Bu iş gibi görünüyor.

Bu kimse yardımcı olacaktır 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; 
} 

Hope tekrar ekleyin CustomCell.m

- (void)prepareForReuse { 
    [super prepareForReuse]; 

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

yılında hücrenin contentView prepareForReuse kaldırın.

+0

bu çok kaynak pahalı değil mi? Ve artık "yeniden kullanılabilir" değil? –

0

yılında

Teşekkür:

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

"willDisplayCell" içinde rengi ayarlamayı denedim, ancak aynı sonuçtur. Yeniden kullanılan hücrenin eski içeriğini temizlemez ... – SFF

+0

[cell.contentView setNeedsDisplay] eklemeyi deneyebilir misiniz; Hücreyi döndürmeden önce ; –

+0

hmm, [cell.contentView setNeedsDisplay] 'i çağırmayı denedim; ancak hala çalışmıyor ... Ayrıca [cell.contentView layoutIfNeeded];' ancak denemedim :( – 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

Bunun doğru kod olduğundan emin misiniz? Neden cellIdentifier'ı indexpath'a göre değiştirirsiniz? Ayrıca, cell = nil hücresinin ayarlanmasından önce == nil çalışmaz ..... Yardımlarınız için teşekkürler ... – SFF

+0

Daha önce aynı sorunla karşılaştım. :) –

+0

Denedim ama cellIdentifier yanlış olduğu için uygulamayı çöker. Ve ayrıca hücre = nil'i ayarlarsam, tüm hücreleri boş bırakır. – SFF

İlgili konular