SDWebImage in ScrollView verwenden

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • SDWebImage in ScrollView verwenden

    Hallo,

    dieses mal arbeite ich daran eine Vielzahl von Images in einer ScrollView über die URL zu laden. Um Bilder über die URL zu laden nutze ich die Library SDWebImage. Normalerweise hatte das immer ganz gut geklappt, doch irgendwie haut etwas dabei gerade nicht hin.

    Ich kriege für folgende Zeile immer den Fehler:
    questionImageView.sd_setImage(with: imageUrl)
    Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

    Im folgenden seht ihr meinen Code der das ganze bewerkstelligen soll.
    - questionPictureArray ist dabei das Array in dem sich alle Bildernamen befinden die ich auslesen möchte (habe mir das auch schon in der Console mal ausgeben lassen)
    - allQuestionPictureURL ist der URL Vorsatz
    - und dann wäre da noch var questionImageView: UIImageView!

    Quellcode

    1. for (index, picture) in questionPictureArray.enumerated() {
    2. let imageToDisplay = URL(string: allQuestionPictureURL + picture)
    3. print(allQuestionPictureURL + picture)
    4. if let imageUrl = imageToDisplay {
    5. questionImageView.sd_setImage(with: imageUrl)
    6. }
    7. questionImageView.contentMode = .scaleAspectFit
    8. let xCoordinate = CGFloat(index) * self.view.bounds.size.width
    9. contentWidth += view.frame.width
    10. VotingScrollView.addSubview(questionImageView)
    11. questionImageView.frame = CGRect(x: xCoordinate, y: (view.frame.height / 2) - 335, width: 375, height: 375)
    12. }
    Alles anzeigen
    Wenn ich mir die Variable imageUrl über print ausgeben lasse, dann sehe ich auch die URL des Bildes. Warum sagt er dann das nil vorgefunden wurde ?
    Kann mir jemand erklären was hier schief läuft und hat vielleicht ne Ahnung was ich dagegen tun kann ?
  • Hab ich weiter oben schon geschrieben gehabt. Hier mit der Variable: var questionImageView: UIImageView!

    Und ich verwende eine ScrollView weil das schon ganz gut in einer Vorgängerversion funktioniert hat. Ist halt ein schöner Image-Slider :)

    Ich weiß nicht ob es mit einer CollectionView auch so einfach wäre einen Image-Slider zu erstellen :huh:
  • Hm, müsste es nicht

    Quellcode

    1. var questionImageView: UIImageView = UIImageView(image:nil)
    oder so sein?


    Mit

    Quellcode

    1. var questionImageView: UIImageView!
    definierst Du doch einfach nur eine Variable vom Typ UIImageView, aber kein Objekt, oder?

    In der Schleife musst Du natürlich bei jedem Durchlauf ein neues UIImageView Objekt erzeugen. Wenn Du immer nur das zuvor erzeugte UIImageView Objekt verwendest, dann hast Du am Ende der Schleife natürlich auch nur einen UIIImageView in dem ScrollView. ;)
  • @MCDan Oh ja du hast recht. Doch jetzt habe ich genau das Problem was du weiter unten beschrieben hast. Mir wird immer nur das letzte Bild angezeigt, was so natürlich blöd ist :/

    Ich habe also mal überlegt warum das so ist und es muss daran liegen das die Variable imageToDisplay nach dem Durchlauf der Schleife nur die letzte URL beinhaltet oder ? Das komische ist halt das wenn ich mir das ganze über eine Print-Ausgabe ausgeben lasse auch alle URLs sehe.

    Also auf jeden Fall habe ich probiert deinem Hinweis zu folgen und in der Schleife dann für jeden Wert eine ImageView zu erzeugen. Doch leider klappt das nicht :/

    Ich dachte immer das ich über eine for-in Schleife bestimme das meine Angaben auf alle werte im Array angewendet werden. Deswegen verstehe ich auch nicht wirklich warum mir nur das letzte Bild angezeigt wird.

    Was mache ich also falsch ?
  • Wie bereits gesagt verwendest Du nur einen einzigen UIImageView. Du musst aber für jedes Bild einen eigenen UIImageView erzeugen.

    So sollte es eigentlich funktionieren:

    Quellcode

    1. for (index, picture) in questionPictureArray.enumerated() {
    2. let imageToDisplay = URL(string: allQuestionPictureURL + picture)
    3. print(allQuestionPictureURL + picture)
    4. var questionImageView: UIImageView = UIImageView(image:nil)
    5. if let imageUrl = imageToDisplay {
    6. questionImageView.sd_setImage(with: imageUrl)
    7. }
    8. questionImageView.contentMode = .scaleAspectFit
    9. let xCoordinate = CGFloat(index) * self.view.bounds.size.width
    10. contentWidth += view.frame.width
    11. VotingScrollView.addSubview(questionImageView)
    12. questionImageView.frame = CGRect(x: xCoordinate, y: (view.frame.height / 2) - 335, width: 375, height: 375)
    13. }
    Alles anzeigen
  • Also ich habe mal weiter ein wenig geübt und verschiedene Sachen ausprobiert und ich habe da ein Problem das ich nicht ganz verstehe :(


    Quellcode

    1. for (index, picture) in questionToPicture.enumerated() {
    2. for test in picture where test.key == questionLabelText {
    3. for test1 in test.value {
    4. let imageToDisplay: URL? = URL(string: allQuestionPictureURL + test1)
    5. let questionImageView: UIImageView = UIImageView(image:nil)
    6. if let imageUrl = imageToDisplay {
    7. questionImageView.sd_setImage(with: imageUrl)
    8. }
    9. questionImageView.contentMode = .scaleAspectFit
    10. let xCoordinate = CGFloat(index) * self.view.bounds.size.width
    11. contentWidth += view.frame.width
    12. VotingScrollView.addSubview(questionImageView)
    13. questionImageView.frame = CGRect(x: xCoordinate, y: (view.frame.height / 2) - 335, width: 375, height: 375)
    14. }
    15. }
    16. }
    Alles anzeigen
    Dieses mal verwende ich das Array questionToPicture was wie folgt aussieht: var questionToPicture = [[String:[String]]]()
    Das Array erhält seine Daten von der vorherigen Seite also über einen prepare segue. Im Prinzip habe ich aber nicht viel verändert als das ich mehr for in Schleifen verwende (Weiß nicht ob das auch der einfachste Weg ist).

    Nun ja ich habe dann gedacht ich erstelle wieder für jedes Bild eine ImageView. Doch trotzdem wird mir immer nur das letzte Bild angezeigt was sich im Array befindet. Aber warum ? hat es was damit zu tun das index nicht mehr richtig lesbar ist ?

    Würde mich freuen wenn mir das jemand erklären könnte :)
  • MCDan schrieb:

    Lass Dir doch mal ausgeben, welche Werte index in den Schleifen bzw. bei der Verwendung hat.

    Ich tippe jetzt einfach mal, dass questionToPicture nur einen Eintrag im 1. Array hat. Somit dürfte index auch nur einen Wert haben.
    Ich hab die Lösung gefunden :)

    Quellcode

    1. for picture in questionToPicture {
    2. for test in picture where test.key == questionLabelText {
    3. for (index,test1) in test.value.enumerated() {
    4. let imageToDisplay: URL? = URL(string: allQuestionPictureURL + test1)
    5. let questionImageView: UIImageView = UIImageView(image:nil)
    6. if let imageUrl = imageToDisplay {
    7. questionImageView.sd_setImage(with: imageUrl)
    8. }
    9. print(test.value)
    10. questionImageView.contentMode = .scaleAspectFit
    11. let xCoordinate = CGFloat(index) * self.view.bounds.size.width
    12. contentWidth += view.frame.width
    13. VotingScrollView.addSubview(questionImageView)
    14. questionImageView.frame = CGRect(x: xCoordinate, y: (view.frame.height / 2) - 335, width: 375, height: 375)
    15. }
    16. }
    17. }
    Alles anzeigen
    Den Index für die falsche Klammer gesetzt :)