AlamofireImage af_setImageWithURL in einer UITableViewCell ohne Platzhalterbild

9

Ich verwende AlamofireImage, um ein Bild auf einer UIImageView in einer UITableViewCell wie folgt zu setzen:

cell.imageView.af_setImageWithURL(url)

Das Bild wird nach dem Herunterladen nicht angezeigt. Es wird das Bild das zweite Mal anzeigen, wenn es aus dem Speichercache geladen wird.

Es scheint, dass die Verwendung eines Platzhalterbildes den Unterschied macht.

Dies funktioniert und druckt die Adresse des (heruntergeladenen) Bildes:

%Vor%

Dies funktioniert nicht und druckt "image: nil"

%Vor%

Dies funktioniert auch, wenn Sie die Zellen imageView auf ein leeres Bild setzen, bevor Sie af_setImageWithURL:

ausführen

cell.imageView.image = UIImage()

Ist das ein Fehler in UITableViewCell, AlamofireImage oder mache ich etwas falsch?

    
Jorn van Dijk 02.12.2015, 03:08
quelle

2 Antworten

1

Sie können den Fehler drucken, indem Sie zwei Zeilen Code hinzufügen, damit Sie mehr über das Problem erfahren.

%Vor%

In meinem Fall gab es ein Problem mit der Image URL. Es wurde das Bild heruntergeladen, wenn ich es im Browser öffne.

    
Sujal 18.03.2016 13:35
quelle
1

Diese Frage ist ein paar Jahre alt, aber vielleicht kann diese Antwort für jemand anderen mit einem ähnlichen Problem nützlich sein, wie ich es zuvor, um die richtige Lösung zu finden.

Da die Bilder asynchron geladen werden und wir keine feste Höhe für die UIIMageView bereitstellen, müssen wir eine Zellenaktualisierung erzwingen, wenn der Download abgeschlossen ist . Dies deshalb, weil die Zellenaktualisierung (d. H. Die Neuberechnung von AutoLayout-Abhängigkeiten) automatisch erst nach der cellForRowAt -Methode durchgeführt wird, die aufgerufen wird, wenn eine Zelle zum ersten Mal angezeigt wird oder wenn die Tabelle gescrollt wird, um andere Zellen anzuzeigen. In beiden Fällen werden die Bilder wahrscheinlich noch nicht von der Methode af_setImage() heruntergeladen, so dass nichts als der Platzhalter angezeigt wird, da ihre Größe momentan unbekannt ist.

Um eine Zellenaktualisierung zu erzwingen, müssen wir die Methoden beginUpdates() und endUpdates() verwenden und sie in den Beendigungshandler von .af_setImage() einfügen. Auf diese Weise wird die Zelle jedes Mal aktualisiert, wenn der Download abgeschlossen ist.

Um jedoch eine Schleife zu vermeiden, müssen wir vor dem Aufruf von beginUpdates() / endUpdates() prüfen, ob wir die Zelle bereits vorher aktualisiert haben, da durch den Aufruf dieser Methoden cellForRowAt Methode wird erneut aufgerufen und folglich der af_setImage() und seine Abschlussschließung mit beginUpdates() / endUpdates() drin).

Dies bedeutet, dass wir die Zelle nur aktualisieren müssen, wenn der Download gerade beendet ist, und nicht, wenn das Bild bereits eingelöst wurde (wenn es eingelöst wird, bedeutet dies, dass wir bereits aktualisiert haben die Zelle). Dies kann durch Überprüfen der Antwort des Completion-Handlers erreicht werden: Wenn es nicht nil ist, wurde das Bild nur downoladed, wenn es nil ist, wurde das Bild eingelöst.

Als Nebeneffekt wird die Zellenhöhe automatisch angepasst (denken Sie daran, tableView.estimatedRowHeight = 400 und tableView.rowHeight = UITableViewAutomaticDimension in Ihre viewDidLoad() -Methode zu setzen)

Schließlich ist hier der Code:

%Vor%

Das ist alles Leute! ; -)

    
Guido 09.06.2017 09:58
quelle