2017-11-20 1 views
0

In cellForItemAt indexPath Ändern Ich nenne:Collectionzell Bilder

if cell.venueImageView.image == nil { 
    cell.loadImage(imageURL: venue.imageURL) 
} 

loadImage Funktion ist in UICollectionViewCell Klasse:

func loadImage(imageURL: String) { 
    print("LOAD IMAGE: \(imageURL)") 
    Alamofire.request("http://***/" + imageURL).responseImage { response in 
     if let image = response.result.value { 
      self.venueImageView.image = image 
     } 
    } 
} 

Zum ersten Mal ist es richtig Bilder zeigt, aber wenn ich dann nach unten scrollen dann oben erscheint das erste Bild in der zweiten Zelle und das zweite Bild erscheint in der ersten Zelle und so weiter. Was ist falsch in meinem Code?

Antwort

2

Implementieren Sie diese Methode in Ihrem UICollectionViewCell:

override func prepareForReuse() { 
    super.prepareForReuse() 

    venueImageView.image = nil 
} 

Diese jedes Mal aufgerufen wird, bevor eine Zelle wiederverwendet wird. Sie sollten auch versuchen, das heruntergeladene Bild zu speichern. Andernfalls muss das Bild bei jedem Bildlauf geladen werden.

Zur Verdeutlichung: Ihre Zelle wird wiederverwendet, wenn Sie vom Bildschirm scrollen, um Speicherlecks zu vermeiden. Das bedeutet, dass das heruntergeladene Bild ebenfalls gelöscht wird. Wenn Sie das nächste Mal zu der Zelle blättern, ist das Bild verschwunden und muss erneut heruntergeladen werden. Wenn ich Sie wäre, würde ich alle heruntergeladenen Bilder in einem Array in Ihrem ViewController speichern und das Bild in cellForItemAt indexPath mit cell.venueImageView.image = imageArray[indexPath.row] setzen.