2017-07-07 10 views
0

userdefaultsでイメージを保存し、このコードで別のビューで使用しますが、エラーが表示されます。イメージを保存するには

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

あなたがNSUserDefaultsに直接UIImageを保存することはできません私に

+2

まず、ビュー(コントローラ)間の一時的なデータストレージとして 'UserDefaults'を誤用しないでください。エラーが発生した場合は、' img'のタイプがプロパティリストに準拠していません。 – vadian

+0

イメージをドキュメントに保存し、イメージへのパスを 'UserDefaults'に保存する方が簡単です。これは簡単な作業です。 –

+0

@ MoeAbdul-Hameedどうすればいいですか? – MJP

答えて

1

これは私がやる方法です。

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)") 
     } 
    } 
} 

あなたはそれがピークメモリ使用量の時間の間、システムによって消去したい場合は、キャッシュディレクトリはより良い場所です:あなたはそれを保存するための複数の場所を持って、ユーザーのドキュメントフォルダは、通常は最高です

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

編集:他の人のような画像

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

保存したファイルから画像を読み込む方法を示してください。 – wottle

+1

私は同意します。完了しました。私は私の答えを調整できるように貯蓄がうまくいかなかったかを見て待っていました。しかし、答えを完成したままにすることが最善です。 – Mozahler

+0

@Mozahlerは非常に感謝しています。 – MJP

0

を助けてください。 NSDataという名前で保存できますが、実際はお勧めできません。 NSUserDefaultsは、小さな値の情報をキー値のペアに格納することを意味します。あなたがそこに画像を投げ始めると、それのために予約されたスペースを過負荷にする可能性があります。 NSUserDefaultsの内容はplistに書き込まれます。私はあなたがユーザーのデフォルトにアクセスするたびに、ファイル全体を読み込むと信じています。そこに大きな画像を置くと、多くの不必要なI/Oが発生します。

これを行うことを決めるのであれば、hereは画像からNSDataオブジェクトを取得する際の良い投稿です。

+0

あなたは何をすべきなのですか? – MJP

+0

私はビューで画像を撮って、別のビューでその画像を表示したい – MJP

+1

別のビューで使用する画像を保存するだけであれば、@Mozahlerはその答えで示唆し、ユーザーの文書に保存しますディレクトリ。 – wottle

0

の取得は、ユーザーのデフォルトに画像を保存していない、と述べています。これはわずかなデータを対象としています。

あなたがしたいのは、別のビューコントローラで画像を渡すだけで、ユーザーが終了してアプリを再起動した場合でも画像を維持する気にならない場合は、画像をprepareForSegueに渡すだけです。

関連する問題