2014-01-15 9 views
6

Ich benutze eine UICollectionview, um viele benutzerdefinierte Zellen (250 mehr oder weniger) zu zeigen.Falsche Bildladung in uicollectionviewcell beim Scrollen

Diese Zellen haben ein Hauptbild und etwas Text. Da die Bilder aus dem Internet heruntergeladen werden müssen, verwende ich die externe Bibliothek AsyncImageView, um die Lazy-Load-Sachen zu machen.

Aber das Problem ist, dass die wiederverwendbare Eigenschaft der Zellen mich verrückt machen.

Wenn ich scroll die Bilder erscheinen in den falschen Zellen. Wie kann ich den Bildern neben dem Indexpfad ein Tag oder etwas hinzufügen, um das Problem zu vermeiden?

Vielleicht AsyncImageView hat eine Lösung für das Problem, das ich ignoriere ...

Oder eine andere Alternative wäre eine bessere Wahl?

Irgendwelche Hinweise?

Vielen Dank im Voraus

Edit: Eine vereinfachte Version von meinem Code

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 

static NSString *identifier = @"Cell"; 

CollectionComercioCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath]; 


if (cell == nil){ 
} 
else{ 
    [[AsyncImageLoader sharedLoader] cancelLoadingImagesForTarget: cell.myImage]; 
} 

cell.myImage.imageURL = nil; 
cell.myImage.image = nil; 

cell.myImage.hidden = TRUE; 

cell.myImage.imageURL = [[myArray objectAtIndex:indexPath.row] getLogoUrl]; 

cell.myText.text = [[myArray objectAtIndex:indexPath.row] getName]; 

cell.myImage.hidden = FALSE; 

return cell; 

}

CustomCell.m

- (void)prepareForReuse 
{ 
    [super prepareForReuse];  
    self.myImage.image = nil; 
} 
+0

zeigen Sie Ihre ZelleForRow – Joshua

+0

haben Sie versucht, das Bild der Zelle auf Null zu setzen, bevor Sie ein neues Bild hinzufügen? Das sollte jetzt ein Bild in der Zelle zeigen – Pfitz

+0

Du hast recht @Pfitz jetzt bleiben die Bilder in der richtigen 'Zelle' wenn ein Bildlauf langsam erfolgt. Aber wenn ich schnell scrolle, wird ein falsches Bild für eine Sekunde oder weniger angezeigt (das Bild, das auf diesem 'Indexpfad 'vor dem Scrollen war). Kann dies vermieden werden? Danke – Andoxko

Antwort

5

Stellen Sie sicher, das Bild auf Null in Ihre cellForRowAtIndexPath: Methode. Auf diese Weise bleibt es mindestens leer, bis das neue Bild geladen ist.

Wie Sie in Ihren Kommentaren zu der Frage erwähnt haben, dass dies funktioniert, wenn Sie langsam scrollen und nicht, wenn Sie schnell scrollen, könnten Sie vielleicht - (void)prepareForReuse auf Ihrer benutzerdefinierten Zelle überschreiben. Aber beachten Sie, dass Apple nicht verwenden, um es für inhaltliche Änderungen warnt:

Aus Performance-Gründen sollten Sie nur dann zurückgesetzt Attribute der Zelle , die nicht zum Inhalt, zum Beispiel alpha, Bearbeitung bezogen und Auswahlstatus. Der Delegat der Tabellenansicht in tableView: CellForRowAtIndexPath: sollte immer alle Inhalte zurücksetzen, wenn eine Zelle wiederverwenden. Wenn dem Zellobjekt kein Identifikator zugewiesen wurde, wird diese Methode nicht aufgerufen. Wenn Sie diese Methode überschreiben, müssen Sie sicher sein, dass Sie die Superklassenimplementierung aufrufen, .

+0

Ich habe die Frage mit den Änderungen bearbeitet, die Sie mir sagen, aber leider funktioniert es nicht für mich. Die Bilder erscheinen für eine Sekunde oder weniger immer noch an falschen Stellen ... – Andoxko

+0

Vielen Dank, dass Sie dies hervorgehoben haben. Ich benutze prepareForReuse auf diese Weise, gut zu wissen, dass es nicht immer ratsam ist. –

+0

@ joel.d Ist diese Warnung für UICollectionViewCell? Die Klassendokumente für "UICollectionReusableView" scheinen in der Beschreibung für 'prepareForReuse' nicht auf diese Warnung zu verweisen: https://developer.apple.com/library/ios/documentation/UIKit/Referenz/UICollectionReusableView_class/ – Crashalot

Verwandte Themen