質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

463閲覧

swift 選択した画像の保存(永続化)の方法を教えてください

kanet

総合スコア13

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2018/04/18 03:58

編集2018/04/19 09:25

前提・実現したいこと

iOSアプリ開発初心者です。
プロフィールを表示するような簡単なアプリから初めているのですが、
テキストは永続化できましたが、選択した画像の永続化の方法が分かりません。
初期値を入れればいいのかなと思いましたがやり方が分かりません。
よろしくお願いします。どなたか教えていただけると幸いです。

発生している問題・エラーメッセージ

Fatal error: Unexpectedly found nil while unwrapping an Optional value

エラーが出たのは以下の2行目let data:NSData =・・の部分です

swift

1 func readimage() -> UIImage { 2 let data:NSData = userdefault.object(forKey: "画像キー") as! NSData 3 let savedata = UIImage(data: data as Data) 4 return savedata! 5 }

該当のソースコード

swift

1import UIKit 2 3class ViewController: UIViewController ,UINavigationControllerDelegate,UIImagePickerControllerDelegate{ 4 5 @IBOutlet weak var imageview: UIImageView! 6 7 @IBAction func selectphoto(_ sender: Any) { 8 9 let controller = UIImagePickerController() 10 controller.sourceType = .photoLibrary 11 controller.delegate = self 12 present(controller, animated: true, completion: nil) 13 14 } 15 16 let userdefault = UserDefaults.standard 17 18 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 19 imageview.image = info[UIImagePickerControllerOriginalImage] as? UIImage 20 saveimage(画像: imageview.image!) 21 dismiss(animated: true, completion: nil) 22 } 23 24 func saveimage(画像:UIImage){ 25 userdefault.set(画像, forKey: "画像キー") 26 } 27 28 func readimage() -> UIImage { 29 let data:NSData = userdefault.object(forKey: "画像キー") as! NSData 30 let savedata = UIImage(data: data as Data) 31 return savedata! 32 } 33 34 override func viewDidLoad() { 35 super.viewDidLoad() 36 // Do any additional setup after loading the view, typically from a nib. 37 38 imageview.image = readimage() 39 } 40 41 override func didReceiveMemoryWarning() { 42 super.didReceiveMemoryWarning() 43 // Dispose of any resources that can be recreated. 44 } 45 46 47}

試したこと

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2018/04/18 04:47 編集

コードは ``` で囲って下さい。あと、どこでエラーが出ているか書いて下さい。
kanet

2018/04/19 09:13

コード記載方法を知らずにすみません。エラーはfunc readimage() の中の1行目で発生しています。よろしくお願いいたします。
fuzzball

2018/04/19 10:47

一度も保存していない状態だと落ちますが、そういう状態ではないですか?
kanet

2018/04/20 04:14

u39uedaさんがおっしゃる通りデータを変換し、一度保存したらエラーなくなりました。ありがとうございます
guest

回答2

0

ベストアンサー

問題はいくつかあります。

  • UserDefaultsにはUIImageは保存できない
  • UserDefaultsは画像みたいな大きなデータを保存するのは向かない
  • 提示されているエラーメッセージはUserDefaultsとは関係ない

一つ一つ解説します。

UserDefaultsにはUIImageは保存できない

UserDefaultsに保存できるデータの型は決まっています。
詳しくはリファレンスを見て欲しいですが、少なくともUIImageは保存できません。
UIImageを保存しようとするならば、Data型に変換すればいいでしょう。

Swift

1let pngImageData: Data? = UIImagePNGRepresentation(image)

UserDefaultsは画像みたいな大きなデータを保存するのは向かない

pngImageDataをUserDefaultsに渡せば保存することはできると思います。
ですが画像はデータサイズが大きいので通常はUserDefaultsには保存しません。自分は体験したことないですが、大きいデータを保存しすぎるとアプリの起動に時間がかかるようになるそうです。
なのでファイルやデータベースに保存するのが多いと思います。

とりあえずDocumentsディレクトリにファイルとして保存するには以下のようにします。

Swift

1let documentsURL: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! 2let fileURL: URL = documentsURL.appendingPathComponent("image.png") 3do { 4 try pngImageData!.write(to: fileURL) 5} catch let e { 6 print("画像書き込み失敗:", e) 7}

提示されているエラーメッセージはUserDefaultsとは関係ない

これで画像をファイルとして永続化できると思うのですが、そもそも質問に貼ってもらってあるエラーメッセージを見るにそれ以外の部分でクラッシュしているように思います。
なのでどこでエラーが発生しているかを提示していただかないとわかりません。

と、いうことでfuzzballさんの質問への追記修正依頼に答えてもらわないと回答できません。

投稿2018/04/18 08:03

u39ueda

総合スコア950

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kanet

2018/04/19 09:19

ありがとうございます。エラー個所追記させていただきました。ファイルへの保存もトライしてみます。
kanet

2018/04/20 04:16

おかげさまで、UserDefaultsでの保存は成功しました。ありがとうございます ファイルへの保存にもトライしてみます。またよろしくお願い致します。
guest

0

setの後はsynchronizeで同期してください。

func saveimage(画像:UIImage){ userdefault.set(画像, forKey: "画像キー") userdefault.synchronize() }

投稿2018/04/18 06:22

KaiShoya

総合スコア551

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kanet

2018/04/19 09:17

ご回答ありがとうございます。試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問