2015-01-13 14 views
7

Ich stelle ein Bild, heruntergeladen mit sdwebimage, in meinem UITableViewCell. Um die UITableView davon abzuhalten, falsche Bilder anzuzeigen, muss ich das Bild auf nil in prepareForReuse festlegen. Allerdings habe ich einige Probleme damit, dies zu implementieren.Wie implementiere ich `prepareForReuse`?

Dies ist, wo ich das Bild gesetzt:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString * reuseIdentifier = @"programmaticCell"; 
    MGSwipeTableCell * cell = [self.tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; 
    if (!cell) { 
     cell = [[MGSwipeTableCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier]; 
    } 

    CGFloat brightness = [UIScreen mainScreen].brightness; 

    cell.textLabel.text = [self.streams[indexPath.row] name]; 
    cell.detailTextLabel.text = [self.streams[indexPath.row] published]; 

    NSString *imageUrl = [NSString stringWithFormat: @"%@", [self.streams[indexPath.row] photo]]; 

    NSLog(@"Image is: %@ and path is: %d", imageUrl, indexPath.row); 

    [cell.imageView sd_setImageWithURL:[NSURL URLWithString:imageUrl] 
         placeholderImage:[UIImage imageNamed:@"tile-blue.png"] options:indexPath.row == 0 ? SDWebImageRefreshCached : 0]; 

    cell.delegate = self; //optional 

    return cell; 
} 

Wenn ich - (void)prepareForSegue Xcode implementieren hält Fehler werfen sagen, dass cell es nicht verfügbar ist. Was ist der richtige Weg, dies zu implementieren?

+1

'prepareForReuse' auf' MGSwipeTableCell' umgesetzt wird. Hier wird der Bezug auf die Zelle "self" anstelle von "cell" genannt. –

+0

Aber wenn ich 'self.textLabel = nil' mache, wird' Property 'textLabel' nicht gefunden auf Objekt vom Typ 'ViewController'' – user4334509

+1

Sie haben 'prepareForSegue' auf Ihrem' ViewController' als die Implementierung von 'prepareForReuse' an Ihre 'MGSwipeTableCell'. Gehen Sie zu Ihrer '@implementation MGSwipeTableCell' und implementieren Sie' prepareForReuse' dort. –

Antwort

10

versuchen, dies zu Ihrem MGSwipeTableCell.m fügte hinzu:

-(void)prepareForReuse 
{ 
    [super prepareForReuse]; 

    self.textLabel.text = @""; 
    self.detailTextLabel.text = @""; 
    self.imageView.image = nil; 
} 
+7

Als Kommentar zur obigen Lösung, die Mike wahrscheinlich kennt (war nur Demo-Code): Implementiere prepareForReuse nicht, um den Inhalt einer Zelle zurückzusetzen. Es sollte nur das Aussehen zurücksetzen. Aus der Dokumentation: "Aus Leistungsgründen sollten Sie nur Attribute der Zelle zurücksetzen, die nicht mit dem Inhalt in Zusammenhang stehen, z. B. Alpha-, Bearbeitungs- und Auswahlstatus." Weiter: "Der Delegat der Tabellenansicht in tableView: cellForRowAtIndexPath: sollte immer den gesamten Inhalt zurücksetzen, wenn eine Zelle wiederverwendet wird". Setze Inhalt wie text in cellForRowAtIndexPath und setze die Darstellung in '' 'prepareForReuse''' zurück. –

+0

Danke für diese Erklärung. Das wusste ich eigentlich nicht. Das werde ich mir in Zukunft merken. Normalerweise setze ich Inhalt in cellForRowAtIndexPath, aber manchmal Inhalt in prepareForReuse zurück. –

+3

Sie sind herzlich willkommen! Ich bin vor nicht allzu langer Zeit darauf gestoßen. Es ist gut, sich daran zu erinnern, wenn Sie versuchen, die beste Leistung aus dem UITableView herauszuholen. –

Verwandte Themen