2015-01-13 12 views
7

Sto impostando un'immagine, scaricata con sdwebimage, nel mio UITableViewCell. Per evitare che UITableView visualizzi immagini errate, è necessario impostare l'immagine su nil in prepareForReuse. Tuttavia, sto avendo qualche problema nell'implementazione di questo.Come implementare `prepareForReuse`?

Questo è dove ho impostato l'immagine:

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

Quando implemento - (void)prepareForSegue Xcode mantiene gettando errori dicendo che cell non è disponibile ad esso. Qual è il modo corretto per implementare questo?

+1

'prepareForReuse' è implementata sul' MGSwipeTableCell'. Qui, il riferimento alla cella è chiamato 'self' invece di' cell'. –

+0

Ma se eseguo 'self.textLabel = nil', lancia' Proprietà 'textLabel' non trovata su oggetto di tipo 'ViewController'' – user4334509

+1

Hai sbagliato 'prepareForSegue' sul tuo' ViewController' come l'implementazione di 'prepareForReuse' su il tuo 'MGSwipeTableCell'. Vai al tuo '@implementation MGSwipeTableCell' e implementa' prepareForReuse' lì. –

risposta

10

Prova ad aggiungere questo alla tua MGSwipeTableCell.m:

-(void)prepareForReuse 
{ 
    [super prepareForReuse]; 

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

Come commentare la soluzione di cui sopra, che probabilmente Mike sa (era solo un codice demo): non implementare prepareForReuse per reimpostare il contenuto di una cella. Dovrebbe solo resettare l'aspetto. Dai documenti: "Per motivi di prestazioni, è necessario reimpostare solo gli attributi della cella che non sono correlati al contenuto, ad esempio alpha, modifica e stato di selezione.". Inoltre: "Il delegato della vista tabella in tableView: cellForRowAtIndexPath: dovrebbe sempre ripristinare tutto il contenuto quando riutilizzi una cella". Imposta contenuto come testo in cellForRowAtIndexPath, resetta l'aspetto in '' 'prepareForReuse'''. –

+0

Grazie per questa spiegazione. In realtà non lo sapevo. Lo terrò a mente in futuro. In genere, imposto il contenuto in cellForRowAtIndexPath ma a volte reimpostare il contenuto in prepareForReuse. –

+3

Sei il benvenuto! Mi sono imbattuto in questo non molto tempo fa. È bene tenere a mente quando si cerca di ottenere le migliori prestazioni da UITableView. –