2016-04-19 10 views
0

Ich habe eine CollectionView in TableViewController. Die Zellen der Sammlungsansicht dienen zum Anzeigen von Fotos von Benutzern. Was ich jedoch von der Datenbank abrufe, ist der URL-Pfad.Zuweisen von UIImage zu Collection View Cell

ich auch mehr zu manipulieren, auf den Bildern Daten plane, so wählte ich sie in einem Array speichern profileImages (aber ich bin nicht sicher, ob ich als Array von NSURL verwenden sollte) ..

(I Firebase als Backend Welche lebendigen Streams für die Änderungen ist auch verwenden, das ist, warum ich ein Setup des isIndexValid Prüfungsteil)

class TableViewController: UITableViewController, UICollectionViewDataSource { 

    @IBOutlet weak var collectionView: UICollectionView! 

    var profileImages = [NSURL]() 

    // Database Checks Hits into `retrievePhotos()` 

    func retrieveUserPhotos(user: AnyObject) { 
    if let profilePicLink = user["firstImage"]! { 
     let firstImagePath = profilePicLink as! String 

     if let fileUrl = NSURL(string: firstImagePath) { 
      print(fileUrl) 
      let isIndexValid = profileImages.indices.contains(0) 

      if (!isIndexValid) { 
       profileImages.append(fileUrl) 
       print(profileImages) 
      } else { 
       profileImages[0] = fileUrl 
      } 
     } 
    } 
    } 

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return 1 
    } 

Bisher everyhing schön funktioniert. Ich erhalte jetzt die Bild-URL erfolgreich.

Aber an diesem Punkt wurde ich verwirrt bei der Zuordnung des Bildes zu UIImage in Zelle. (Ich versuchte es mit Heneke, da es einfacher schien).

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

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

    // below returns fatal error `Index out of range` 
    cell.currentImage.hnk_setImageFromURL(profileImages[indexPath.row]) 


    // Also tried this but it doesn't update the UIImage. 
    // I guess it's because it's already loaded once without download of the images from the link get completed: 
    if profileImages.count > 0 { 
     cell.currentImage.hnk_setImageFromURL(profileImages[indexPath.row]) 
    } 

    return cell 

} 

Was ist der richtige Weg, Bilder abzuholen und dem UIImage der Collection View-Zelle zuzuweisen?

+0

Ich habe meine Frage aktualisiert. Wenn ich das Einchecken in 'cellForItemAtIndexPath' durchführe, wird das Bild nie aktualisiert – senty

+1

http://StackOverflow.com/questions/26920632/how-to-asynchroness-load-uitableviewcell-images-so-that-scrolling-doesnt-lag oder https://www.natashatherobot.com/ios-how-to-download-images-asynchron-make-uitableview-scroll-fast/ oder https://developer.apple.com/library/ios/samplecode/LazyTableImages/Introduction /Intro.html sollte dich auf den Weg bringen – Moonwalkr

+0

Die Antwort war 'collectionView.ReloadData()' danach. Nachdem ich ein bisschen mehr getippt habe, verstehe ich die Natur davon. Danke – senty

Antwort

1

Wo Sie die reloadItemAtIndexPaths anrufen, hängt davon ab, wie Sie die asynchronen Operationen jetzt lösen. Ihre asynchrone Operation sollte für jedes heruntergeladene Bild aufgerufen werden, damit Sie die entsprechende Zeile immer dann aktualisieren können, wenn das Bild für diese Zeile abgerufen wurde. In dem Callback oder was auch immer für diese Operation, rufen Sie

collectionView.reloadItemsAtIndexPaths(myArrayOfIndexPaths) 

myArrayOfIndexPaths dann nur noch 1 Artikel enthalten würde, die die indexPath für die aktuelle Zeile sind. Sie hätten also eine async fetch-Methode, die Sie mit dem aktuellen indexPath als Parameter aufrufen. Sie fügen dies zu einem leeren myArrayOfIndexPaths hinzu, und Sie rufen dann erneut auf.

+0

Zuerst habe ich versucht, 'collectionView.ReloadData()' in 'reveetUserPhotos()' an der Unterseite zu setzen. Es funktionierte gut, aber Ihr Kommentar ermutigte mich, es anzupassen. Jetzt habe ich jedoch versucht, es in 'collectionView.ReloadItemsAtIndexPaths (profileImages)' 'zu ändern, aber ich konnte nicht herausfinden, was in die Pharantisis zu setzen. – senty

+1

Wenn Ihre 'retrieveUserPhotos' alle Fotos abruft, dann sind Sie nicht wirklich Aktualisieren der Zeilen, sobald jedes Foto fertig ist. Sie holen dann ALLE Fotos asynchron und laden sie dann neu. In diesem Fall ist es besser, reloadData() zu verwenden. JEDOCH: Das ist keine gute Lösung, da du alle Fotos abrufst, obwohl das wahrscheinlich mehr Fotos sind, als du gerade zeigst. Wenn der Benutzer 500 Fotos hat, werden ALLE Fotos abgerufen, bevor die Ansicht erneut geladen wird. Sehr ineffizient. Deshalb sollten Sie eine Funktion haben, die für jede Zeile aufgerufen wird, während sie angezeigt wird – Moonwalkr

Verwandte Themen