2017-07-24 5 views
1

da! Ich brauche deine Hilfe. Ich habe UIImage innerhalb von UICollectionView welches innerhalb von UITableView liegt. Wenn ich beim ersten Mal Daten von der API bekomme, werden die Bilder richtig angezeigt, aber wenn ich scrolle und zurückkomme, werden falsche Bilder angezeigt. Mein Code sieht wie folgt aus:zeigen falsche Bilder in UICollectionView

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! AllPostsOfUserCollectionViewCell 

    let post = allPostsOfUserArray[collectionView.tag] 
    if post.imageLinks.count != 0 { 
     let imageLink = post.imageLinks[indexPath.row] 

     if imageLink.imageLink != nil { 
      let url = URL(string: imageLink.imageLink!) 

      cell.imageOfAnimalInCollectionView.sd_setImage(with: url!, placeholderImage: UIImage(named: "App-Default"),options: SDWebImageOptions(rawValue: 0), completed: { (image, error, cacheType, imageURL) in 
      }) 
     } 
    } 

    return cell 
} 

Mein Modell sieht wie folgt aus:

class UserContent { 

var name = "" 
var imageLinks = [UserImages]() 

init(name: String, imageLinks: [UserImages]?) {   
    self.name = name 
    if imageLinks != nil { 
     self.imageLinks = imageLinks! 
    } 
} 

init() { } 

deinit { 
    imageLinks.removeAll() 
    } 
} 


class UserImages { 

var imageLink: String? 

init(imageLink: String?) { 
    self.imageLink = imageLink 
} 

init() { } 

deinit { 
    imageLink = "" 
    } 
} 

Was ich in UITableView

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let index = indexPath.row 

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! AllPostsOfUserTableViewCell 

    cell.collectionView.tag = index 

    let post = allPostsOfUserArray[index] 
    if post.imageLinks.count == 0 { 
     cell.collectionView.isHidden = true 
    } else { 
     cell.collectionView.isHidden = false 
    } 

    return cell 
} 

UPD: I cell.collectionView.reloadData hinzugefügt() FUNC tableview (cellForRowAt indexPath). Jetzt funktioniert es gut.

+0

In allen Ihren 'else' (die Sie nicht getan haben), müssen Sie das Bild entfernen oder einen Platzhalter setzen. – Larme

Antwort

0
cell.imageOfAnimalInCollectionView.image = nil 
if post.imageLinks.count != 0 { 
    let imageLink = post.imageLinks[indexPath.row] 

    if imageLink.imageLink != nil { 
     let url = URL(string: imageLink.imageLink!) 

     cell.imageOfAnimalInCollectionView.sd_setImage(with: url!, placeholderImage: UIImage(named: "App-Default"),options: SDWebImageOptions(rawValue: 0), completed: { (image, error, cacheType, imageURL) in 
     }) 
    } 

} 

(nicht getestet, sollten aber funktionieren. Sie können auch sd_image ‚s-Methode eine leere URL, mit einem Platzhalter Bild zuweisen nur den Platzhalter Bild zu zeigen. Oder geben Sie nur eine leere URL-Zeichenfolge '' ohne die Platzhalter-Bild)

Jedes Mal, wenn Sie blättern, werden die Zellen wiederverwendet, und das Bild der Zelle zugeordnet wird erneut angezeigt, weil er immer noch auf der Zelle ist. Sie müssen diese Bilder entfernen, indem Sie mit else Klausel für jeden if, wo Sie ein Bild in die Imageview zuweisen.

Hoffe, das hilft.

+0

Danke, aber ich habe immer noch einige Probleme. Ich denke, vielleicht liegt es am falschen Modell. –

+0

@DmytroRyshchuk toll, dass man eine Lösung gefunden. Trotzdem denke ich, dass es eine gute Übung ist, das Bild auf null oder ein Platzhalterbild zu setzen. Es wird hilfreich sein, wenn Sie mit mehr Daten zu tun haben –

0

Könnten Sie diesen Code versuchen:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! AllPostsOfUserCollectionViewCell 
    cell.imageOfAnimalInCollectionView.image = UIImage(named: "App-Default") 
    let post = allPostsOfUserArray[collectionView.tag] 
    if post.imageLinks.count != 0 { 
     let imageLink = post.imageLinks[indexPath.row] 

     if imageLink.imageLink != nil { 
      let url = URL(string: imageLink.imageLink!) 

      cell.imageOfAnimalInCollectionView.sd_setImage(with: url!, placeholderImage: UIImage(named: "App-Default"),options: SDWebImageOptions(rawValue: 0), completed: { (image, error, cacheType, imageURL) in 
      }) 
     } 
    } 

    return cell 
} 
0

Dieses Problem so etwas wie Race-Bedingung ist. Sie können meine Antwort in similair question

verweisen Möglicherweise müssen Sie ein anderes Modul zum Herunterladen von Bild und zur manuellen Einstellung der Zelle finden.

Verwandte Themen