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

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

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

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

4408閲覧

NSUserDefaultに画像を格納したいのですができません・

atsupoooon

総合スコア47

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

1クリップ

投稿2016/05/06 13:47

編集2016/05/08 09:37

テキストデータはNSUserDefaultに格納できたのですが、画像ができません。

画像をライブラリーから選択して、指定のimageviewに表示させることはできました。
そのあと、表示ができたタイミングでNSUserDefaultに格納したいと思っております。

swift

1@IBAction func ImageBtn(sender: AnyObject) { 2 // フォトライブラリを使用できるか確認 3 if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary){ 4 // フォトライブラリの画像・写真選択画面を表示 5 let imagePickerController = UIImagePickerController() 6 imagePickerController.sourceType = .PhotoLibrary 7 imagePickerController.allowsEditing = true 8 imagePickerController.delegate = self 9 presentViewController(imagePickerController, animated: true, completion: nil) 10 } 11 }

swift

1func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) { 2 3 // 選択した画像・写真を取得し、imageViewに表示 4 if let info = editingInfo, let editedImage = info[UIImagePickerControllerEditedImage] as? UIImage{ 5 ProfileImage.image = editedImage 6 }else{ 7 ProfileImage.image = image 8 } 9 10 // フォトライブラリの画像・写真選択画面を閉じる 11 picker.dismissViewControllerAnimated(true, completion: nil) 12 13 }

swift

1// 画面が表示されたときのアクション 2 override func viewWillAppear(animated: Bool) { 3 4 // NSUserDefaultsクラスを呼び出す 5 //standardUserDefaults():ユーザーデフォルトを準備 6 let profile = NSUserDefaults.standardUserDefaults() 7 let profileSex = NSUserDefaults.standardUserDefaults() 8 9 // stringForKey:データを読み込む 10 let myData = profile.stringForKey("myName") 11 let myDataSex = profileSex.stringForKey("mySex") 12 13 //もし、文字が入っていたら表示 14 if let myDisplay = myData { 15 NameTextField.text = myDisplay 16 } 17 //もし、文字が入っていたら表示 18 if let myDisplay = myDataSex { 19 SexTextField.text = myDisplay 20 } 21 22 }

最終的に下記のようになりました。

swift

1func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) { 2 3 // 選択した画像・写真を取得し、imageViewに表示 4 if let info = editingInfo, let editedImage = info[UIImagePickerControllerEditedImage] as? UIImage{ 5 ProfileImage.image = editedImage 6 }else{ 7 ProfileImage.image = image 8 } 9 10 // UIImage => NSDataに変換してUserDefaultに保存 11 let imageData = UIImageJPEGRepresentation(ProfileImage.image!, 1); 12 NSUserDefaults.standardUserDefaults().setObject(imageData, forKey: "myImage") 13 NSUserDefaults.standardUserDefaults().synchronize() 14 15 // フォトライブラリの画像・写真選択画面を閉じる 16 picker.dismissViewControllerAnimated(true, completion: nil) 17 18 }

swift

1// 画面が表示されたときのアクション 2 override func viewWillAppear(animated: Bool) { 3 4 // NSUserDefaultsクラスを呼び出す 5 //standardUserDefaults():ユーザーデフォルトを準備 6 let profile = NSUserDefaults.standardUserDefaults() 7 8 // stringForKey:データを読み込む 9 let myData = profile.stringForKey("myName") 10 let myDataSex = profile.stringForKey("mySex") 11 12 if let imageData = profile.objectForKey("myImage") as? NSData, image = UIImage(data: imageData) { 13 // UserDefaultsから画像が取得出来た場合ImageViewのimageに設定 14 ProfileImage.image = image 15 16 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

仰るとおりUIImageの形式ではNSUserDefaultsに保存できませんので、NSDataの形に変換して保存してください。
以下簡単なサンプルになります。

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 // Storyboard UIImageView 6 @IBOutlet weak var loadImageView: UIImageView! 7 8 // NSUserDefault Instance 9 let userDefaults = NSUserDefaults.standardUserDefaults() 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 } 14 15 @IBAction func pushSaveButton(sender: UIButton) { 16 17 // UIImage => NSDataに変換してUserDefaultに保存 18 if let image = UIImage(named: "image") { 19 let imageData = UIImageJPEGRepresentation(image, 1); 20 userDefaults.setObject(imageData, forKey: "imageData") 21 userDefaults.synchronize() 22 } 23 } 24 25 26 @IBAction func pushLoadButton(sender: UIButton) { 27 28 if let imageData = userDefaults.objectForKey("imageData") as? NSData, image = UIImage(data: imageData) { 29 // UserDefaultsから画像が取得出来た場合ImageViewのimageに設定 30 loadImageView.image = image 31 } 32 } 33}

提示していただいたサンプルに当てはめた例

swift

1func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) { 2 3 // 選択した画像・写真を取得し、imageViewに表示 4 if let info = editingInfo, let editedImage = info[UIImagePickerControllerEditedImage] as? UIImage{ 5 ProfileImage.image = editedImage 6 }else{ 7 ProfileImage.image = image 8 } 9 10 // UIImage => NSDataに変換してUserDefaultに保存 11 let imageData = UIImageJPEGRepresentation(ProfileImage.image, 1); 12 userDefaults.setObject(imageData, forKey: "imageData") 13 userDefaults.synchronize() 14 15 // フォトライブラリの画像・写真選択画面を閉じる 16 picker.dismissViewControllerAnimated(true, completion: nil) 17} 18 19// 画面が表示されたときのアクション 20override func viewWillAppear(animated: Bool) { 21 22 let profile = NSUserDefaults.standardUserDefaults() 23 24 if let imageData = profile.objectForKey("imageData") as? NSData, image = UIImage(data: imageData) { 25 // UserDefaultsから画像が取得出来た場合ImageViewのimageに設定 26 loadImageView.image = image 27 } 28}

あと細かいですがアドバイスとして、、、NSUserDefaultsオブジェクトはSingletonなので一つ作れば全ての値を取得するのに使用できます。

swift

1 2// NSUserDefaultsクラスを呼び出す 3//standardUserDefaults():ユーザーデフォルトを準備 4let profile = NSUserDefaults.standardUserDefaults() 5 6// stringForKey:データを読み込む 7let myData = profile.stringForKey("myName") 8let myDataSex = profile.stringForKey("mySex") 9

投稿2016/05/06 19:40

編集2016/05/06 19:52
_Kentarou

総合スコア8490

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

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

atsupoooon

2016/05/08 09:38 編集

ご指摘ありがとうございます! 実装できました。 NSDataへの変換がわかりませんでした。 Singletonが知りませんでした。 勉強になりました。 最終的に実装できたコードを質問文に追加しました。 ありがとうございます。 また、宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問