2016-04-11 4 views
0

Ich habe ein String-Array von URLs, die die auf dem Master-Controller angezeigten Auflistungsansichtszellen steuern. Meine benutzerdefinierte Zelle hat eine UIImageView, deren Bildeigenschaft im Hintergrund über einen Funktionsaufruf wie folgt geladen:IOS Swift Segue verwendet Daten von ausgewählten Zellen anstelle des unterstützenden Arrays

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! CollectionViewCell 

    loadImageInBackground(NSURL(string: self.fotosString[indexPath.row])!, target: cell.image!) 
    return cell 
} 

Mein collectionViewController richtig zeigt alle Bilder für die URLs, die ich in dem Array.

Wenn ich zum DetailView übergehe, würde ich gerne die Daten verwenden, die in die Zelle heruntergeladen wurden, anstatt einen neuen Download auszulösen (obwohl das Bild im Cache wäre), basierend auf der URL-Zeichenfolge das Array. So mache ich folgendes:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "showImage" { 
     let dvc = segue.destinationViewController as! DetailViewController 
     let indexPaths = self.collectionView?.indexPathsForSelectedItems() 
     let indexPath = indexPaths![0] as NSIndexPath 
     let cell = self.collectionView!.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! CollectionViewCell 
     dvc.currentImage = cell.image.image 
    } 
} 

jedoch cell.image.image kehrt nil und deshalb mein Ansatz funktioniert nicht.

ich diese wie durch die Einrichtung einer Klasse für meine Fotobilder in einer konventionelleren Weise tun könnte:

urlStr: String 
theImage: UIImage 

Aber ich frage mich, warum ich die nil bekommen, und wie ich das Bild zugreifen können Daten direkt von der Zelle.

+1

Verwenden 'Collection .cellForItemAtIndexPath (indexPath) 'statt' dequeueReusableCellWithReuseIdentifier'. – Caleb

+0

könnten Sie den Code für loadImageInBackground einfügen? das wäre hilfreich, um das Problem zu identifizieren –

+0

Mögliches Duplikat von [So erhalten Sie Zelle atIndex in UICollectionView mit swift?] (http://stackoverflow.com/questions/30405726/how-to-get-cell-atindex-in-uicollectionview -mit-swift) – Caleb

Antwort

2

Sie sollten nicht tun, was Sie wollen/versuchen zu tun. Sie sollten die Bild-URL aus Ihrem Datenmodell übergeben und diese verwenden.

Ihr Problem ist, dass Sie erstellen/eine Zelle wiederverwendet, anstatt das aktuelle zu finden, indem Sie:

let cell = self.collectionView!.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! CollectionViewCell 

wo Sie sollten:

let cell = self.collectionView!. cellForItemAtIndexPath(indexPath) as! CollectionViewCell 
+0

Vielen Dank, dass Sie auf die richtige Methode hingewiesen haben. Allerdings verstehe ich nicht, warum ich es nicht so machen sollte. (Ich habe andere, einschließlich meines ehemaligen Dozenten, gehört, aber niemand konnte die damit verbundenen Probleme so erklären, dass ich mich "ok, deshalb" fühlte. – gone

+0

es geht um Rolle und Verantwortung, die Datenmodell enthält die Daten, die Ansicht zeigt einige Daten an, also wenn Sie Daten von jemandem bekommen müssen, ist es das Datenmodell, nicht die Ansicht, Probleme mit der falschen Art sind schwieriger, es könnte gut funktionieren, aber Sie enden damit ein verwirrtes Durcheinander, bei dem Sie irgendwann etwas in der Benutzeroberfläche ändern möchten und letztendlich den gesamten Fluss unterbrechen oder Daten in einer Ansicht speichern, wenn sie nicht wirklich von der Ansicht verwendet werden, damit Sie sie später wieder abfragen können ... – Wain

+0

Die tatsächlichen Daten sind die URL, während das Bild selbst vom Controller abgerufen wird und somit abgeleitete Daten sind. Kann der Controller im MVC-Muster keine Operationen mit den Daten des Modells durchführen, um sie an die Ansicht zu senden? – gone