2017-07-07 13 views
0

Ich möchte Bild mit Userdefaults speichern und verwenden Sie es in einer anderen Ansicht mit diesem Code, aber es zeigt einen Fehler.So speichern Sie das Bild

UserDefaults.standard.set(img , forKey : "simg") 

bitte helfen Sie mir

+2

Zuerst missbrauchen Sie 'UserDefaults' nicht als temporären Datenspeicher zwischen View (Controller), zweitens, wenn Sie einen Fehler bekommen, ist der Typ von' img' nicht Property List konform. – vadian

+0

Besser ist es, das Bild in Dokumenten zu speichern und dann den Pfad zum Bild in 'UserDefaults' zu speichern, was eine einfache Aufgabe ist. –

+0

@ MoeAbdul-Hameed Wie kann ich das tun? – MJP

Antwort

1

So würde ich es machen. Sie können mehrere Orte haben sie zu retten, den Ordner Dokumente des Benutzers ist in der Regel am besten:

func cacheImageAsPNG(image: UIImage, localID: String) { 
    let userDocumentsURL = URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]) 
    if let imageData = UIImagePNGRepresentation(image) { 
     let filename = userDocumentsURL.appendingPathComponent("\(localID).png") 

     if FileManager.default.createFile(atPath: filename.path, contents: imageData, attributes: nil) { 
      print("wrote file:\n\(filename.path)") 
     } else { 
      print("couldn't write the file:\n\(filename.path)") 
     } 
    } 
} 

, wenn Sie es durch das System während der Zeiten des Spitzenspeichernutzung löschen wollen, das Cache-Verzeichnis ist ein besserer Ort:

let cachesPath = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).last! 

bearbeiten: Suchen Sie das Bild

func cachedImage(localID: String) -> UIImage? { 
    let userDocumentsURL = URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]) 
    let cachePath = userDocumentsURL.appendingPathComponent("\(localID).png") 

    return UIImage(named: cachePath.path) 
} 
+0

Sie sollten wahrscheinlich auch zeigen, wie Sie das Bild aus der gespeicherten Datei einlesen. – wottle

+1

Ich stimme zu. Erledigt. Ich habe gewartet, um zu sehen, wie das Sparen funktioniert hat, damit ich meine Antwort anpassen konnte. Aber es ist am besten, die Antwort vollständig zu lassen. – Mozahler

+0

@Mozahler Vielen Dank es war sehr nützlich – MJP

0

Sie kein UIImage direkt an NSUserDefaults speichern. Sie könnten es als NSData speichern, aber es ist wirklich nicht ratsam. NSUserDefaults soll kleine Informationsbits in Schlüsselwertpaaren speichern. Wenn Sie anfangen, Bilder dorthin zu werfen, könnten Sie den dafür reservierten Platz überladen. Der Inhalt der NSUserDefaults wird in ein Plist geschrieben. Ich glaube, jedes Mal, wenn Sie auf die Benutzereinstellungen zugreifen, liest es die gesamte Datei. Wenn Sie große Bilder dort einlegen, verursacht dies eine Menge unnötiger E/A.

Wenn Sie immer noch entscheiden, es zu tun (nicht empfohlen), here ist ein guter Beitrag auf ein NSData Objekt aus dem Bild zu bekommen.

+0

Also was machst du zu tun? – MJP

+0

Ich nehme das Bild in der Ansicht und ich möchte dieses Bild in einer anderen Ansicht zeigen – MJP

+1

Wenn Sie nur ein Bild für eine andere Ansicht speichern möchten, würde ich tun, wie @Mozahler in seiner Antwort vorschlägt und es in den Dokumenten des Benutzers speichern Verzeichnis. – wottle

0

Wie andere gesagt haben, nicht speichern Bilder auf Benutzereinstellungen. Es ist nur für kleine Datenmengen gedacht.

Wenn Sie nur ein Bild in einem anderen Ansichtscontroller übergeben möchten und es nicht wichtig ist, das Bild dauerhaft zu machen, wenn der Benutzer die App beendet und erneut startet, übergeben Sie einfach das Bild in prepareForSegue.

Verwandte Themen