2015-07-13 15 views
6

Es gibt einen nervigen Fehler, den ich nicht beheben kann.UITableViewCell - wie man den Inhalt vor der Wiederverwendung zurücksetzt

Ich habe eine CustomCell, und darin habe ich eine Unteransicht, die ihre Farbe nach Objekt Wert ändert.

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

Das ist alles funktioniert gut, außer wenn ich eine Zeile mit redColor = YES aus dem Tableview löschen, und ich blättere Zeilen zu zeigen, die nicht sichtbar waren. Die erste Zeile, die sichtbar wird (erste Zeile, die die wiederverwendbare Zelle wiederverwendet), hat eine rote Farbe, obwohl diese Zeile redColor = NO ist. Und wenn ich wieder blättern und die Zelle ausblenden und dann wieder anzeigen, wird die Farbe auf clearColor gesetzt, so wie es sein sollte.

Ich denke, das liegt daran, dass es die gerade gelöschte Zelle wiederverwendet. Also versuche ich den Inhalt der Zelle vor der Wiederverwendung zurückzusetzen. In CustomCell.m

- (void)prepareForReuse { 
    [super prepareForReuse]; 

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

Aber das funktioniert nicht. Apple-Doc sagt

Die Delegierten Tabellenansicht in Tableview: cellForRowAtIndexPath: sollte immer alle Inhalte zurückgesetzt, wenn eine Zelle wiederverwendet.

Was ist der richtige Weg, um Inhalte zurückzusetzen? Muss ich Subviews aus der Superview entfernen?

Vielen Dank im Voraus

+0

Hallo @SFF überprüfe meine Antwort. ,,, –

Antwort

8

Dies scheint zu funktionieren.

Ich entferne die content der Zelle, wenn prepareForReuse in CustomCell.m

- (void)prepareForReuse { 
    [super prepareForReuse]; 

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

es wieder hinzufügen in in 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 this jemand helfen.

+0

ist das nicht zu teuer? Und es ist nicht mehr "wiederverwendbar"? –

0

Sie dieses Tableview Delegatmethode zum Ändern Sichtbarkeit (zB Hintergrundfarbe), nicht aber Daten verwenden kann:

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

Ich habe versucht, die Farbe in der 'WillDisplayCell', aber es ist das gleiche Ergebnis. Der alte Inhalt der wiederverwendeten Zelle wird nicht gelöscht ... – SFF

+0

Können Sie versuchen, [cell.contentView setNeedsDisplay] hinzuzufügen; vor Rückgabe Cell; –

+0

hmm, ich habe versucht, '[cell.contentView setNeedsDisplay] aufzurufen;' aber immer noch nicht funktioniert ... Ich habe auch versucht '[cell.contentView layoutIfNeeded];' aber kein Glück :( – 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

Sind Sie sicher, das ist der richtige Code ?? Warum änderst du den cellIdentifier entsprechend indexpath? Auch das Setzen der Zelle = nil vor Zelle == nil funktioniert nicht ..... Danke auch für deine Hilfe ... – SFF

+0

Ich hatte das gleiche Problem vorher :) –

+0

Ich habe versucht, aber es stürzt die App, weil CellIdentifier falsch ist. Und wenn ich auch cell = nil setze, werden alle Zellen leer. – SFF

Verwandte Themen