2016-12-23 2 views
1

Ich habe ein paar Posts über Probleme mit UICollectionView und iwrong Bilder gefunden, aber alle haben eine gemeinsame - Leute versuchen, Bild in CellForItemAt Methode zu downloaden. Ich habe bereits ein richtiges Bild in meinem App-Bundle und benutze einfach die UIImage (named :) -Methode, um es auf UICollectionViewCell zu setzen. Allerdings bekomme ich immer noch falsche Bilder. Könnte mir jemand helfen?UICollectionView falsches Bild angezeigt

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return liveChannels.count() 
} 

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


     let current = liveChannels.channels[indexPath.row] 
     let currentProgram = current.currentProgram() 

     let channelKey = current.channel?.channelKey 
     let programDetail = currentProgram?.name 

     if let currentProgress = currentProgram?.progress() { 
      cell.progressView.setProgress(currentProgress, animated: true) 
     } 

     print("\(channelKey) - \(current.channel!.logoName)") 
     cell.imageName = current.channel!.logoName 
     cell.channelTitleLabel.text = channelKey 
     cell.channelDetailLabel.text = programDetail 

     cell.channelButton.addTarget(self, action: #selector(ChannelsViewController.pressed(_:)), for: .primaryActionTriggered) 
     return cell 
    } 

ich drucke channelKey und logoName zu trösten sicher sein, dass das richtige Bild in der liveChannels.channels Struktur gespeichert ist. (Sie sind in der Tat richtig).

Dies ist meine Zelle:

class ChannelButtonViewCell: UICollectionViewCell { 

    @IBOutlet weak var progressView: UIProgressView! 
    @IBOutlet weak var channelButton: ChannelButton! 
    @IBOutlet weak var channelDetailLabel: UILabel! 
    @IBOutlet weak var channelTitleLabel: UILabel! 
    @IBOutlet weak var channelImageView: UIImageView! 
    var imageName: String? 

    override func prepareForReuse() { 

     channelImageView.image = nil 

     super.prepareForReuse() 
    } 

    override func draw(_ rect: CGRect) { 
     if (self.isSelected) { 
      if let imageName = imageName { 
       channelImageView.image = UIImage(named: imageName) 
      } 

     } else { 
      if let imageName = imageName { 
       channelImageView.image = UIImage(named: imageName.appending("_grey")) 
      } 

     } 
    } 
} 

Antwort

2

1) Sie func draw(_ rect: CGRect) in sehr seltenen Fällen außer Kraft setzen sollte, und der Fall ist definitiv nicht der.

2) Sie laden Um sicherzustellen, und genau Bild ändern, wenn Sie Zelle var imageName: String? des weisen Sie Swift didSet

3) verwenden, könnte Ihr Bild aktualisiert, um sicherzustellen, wenn Sie Auswahlzustand ändert didSet auch nutzen könnten.

könnten Sie func draw überhaupt Entfernen am Ende und das Hinzufügen von didSet Beobachter wie folgt aus:

class ChannelButtonViewCell: UICollectionViewCell { 

    @IBOutlet weak var progressView: UIProgressView! 
    @IBOutlet weak var channelButton: ChannelButton! 
    @IBOutlet weak var channelDetailLabel: UILabel! 
    @IBOutlet weak var channelTitleLabel: UILabel! 
    @IBOutlet weak var channelImageView: UIImageView! 
    var imageName: String? { 
     didSet { 
      updateImage() 
     } 
    } 

    override var isSelected: Bool { 
     didSet { 
      updateImage() 
     } 
    } 

    override func prepareForReuse() { 
     channelImageView.image = nil 
     super.prepareForReuse() 
    } 

    func updateImage() { 
     guard let imageName = self.imageName else { return } 
     if (self.isSelected) { 
      channelImageView.image = UIImage(named: imageName) 
     } else { 
      channelImageView.image = UIImage(named: imageName.appending("_grey")) 
     } 
    } 

} 

Wenn diese Lösung nicht lösen Ihr Problem versuchen innerhalb von func draw() Breakpoint gesetzt und überprüfen, wenn es aufgerufen wird und was Wert gespeichert in var imageName

+0

Hallo, es sieht aus wie didset den Unterschied machen, jedoch musste ich dort zeichnen, da ich keinen anderen Weg gefunden habe, Bilder basierend auf isSelected Status zu ändern. Haben Sie eine Idee, wo Sie bessere Ergebnisse erzielen können? – BobC

+0

In der Tat verpasste ich solchen Fall, aktualisierte Antwort. –

+0

cool, danke für deine Hilfe, sehr geschätzt. – BobC

Verwandte Themen