Error-Handling mit NSImageView

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

  • Error-Handling mit NSImageView

    Ich habe folgende Funktion geschrieben, bei der eine Bild-URL als String übergeben werden kann - das Bild wird dann im Interface angezeigt. Ich würde nun gerne sicherstellen, dass im Falle einer falschen URL (nicht erreichbar, rechtschreibfehler...) idealerweise nichts passiert. Aktuell erhalte ich in diesem Fall noch einen fatal error: unexpectedly found nil while unwrapping an Optional value.

    Quellcode

    1. func refreshImageView(targetURL: String){
    2. var theTarget = NSURL(string: targetURL)
    3. var error: NSError?
    4. var imageData: NSData = NSData.dataWithContentsOfURL(theTarget, options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &error)
    5. imageViewOutlet.image = NSImage(data:imageData)
    6. }


    Leider gelingt es mir nicht, error == nil o.ä. abzufangen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von mrtn.lxo ()

  • Keine Ahnung vom Swift-Kram, aber für Ressourcen im Netz ist dieser Weg ohnehin nicht der richtige (ich komme wegen "nicht erreichbar" darauf). Apple-Doku dazu:

    Do not use this synchronous method to request network-based URLs. For network-based URLs, this method can block the current thread for tens of seconds on a slow network, resulting in a poor user experience, and in iOS, may cause your app to be terminated.

    Dafür gibt es entsprechende asynchrone APIs (NSURLSession, Streams), bei denen sich das Problem dann wahrscheinlich von alleine löst.
    Multigrad - 360°-Produktfotografie für den Mac
  • Hallo,

    an Deine Stelle würde ich so etwas bauen - ein Beispiel:

    - NSImageView ableiten
    - MyImageView mit einer Methode -setImageFromURL: erweitern
    - wird -setImageFromURL: aufgerufen dann startest Du asynchron den Download der Daten
    - das asynchron geladene Bild setzt Du dann normal mit -setImage:

    Mit so einer nützlichen Klasse kannst Du auch eine Vielzahl von MyImageView in CollectionView, Tabelen etc. anzeigen, ohne das es "stockt"…

    Viele Grüße
  • Vielen Dank für eure Hinweise! Ich hatte bereits eine Funktion implementiert, mit der ich an anderer Stelle via NSURLSession Daten asychron aus dem Netz lade und ausgebe. Darüber habe ich jetzt das Image geladen, und dank completion-Handler wird das Bild jetzt erst dann angezeigt, wenn es geladen ist bzw. im Zweifelsfall dann gar nicht :)

    Nur noch eine Frage zum NSImageView. Kann ich diesem eine backgroundColor zuweisen, sofern kein Bild geladen worden ist (bzw: Wie?) oder ist es einfacher, stattdessen einfach ein lokales Bild zu nehmen?
  • Da gibt's verschiedene Wege - subclassen, etwas in die Background Filter des Views werfen usw. Ein lokales Bild ist auch vollkommen in Ordnung. Hängt etwas vom Einsatzzweck ab (und vom persönlichen Geschmack, was man am elegantesten findet). Wenn es nur eine bestimmte Farbe sein soll, würde ich das Bild per imageWithSize:flipped:drawingHandler: erzeugen und im drawing-Block das gegebene Rechteck mit der Farbe füllen - Pixelgrafiken benutze ich nur, wenn es sein muss.
    Multigrad - 360°-Produktfotografie für den Mac