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

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

ただいまの
回答率

90.47%

  • Swift 2

    1334questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,377

atsupoooon

score 31

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

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

@IBAction func ImageBtn(sender: AnyObject) {
        // フォトライブラリを使用できるか確認
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary){
            // フォトライブラリの画像・写真選択画面を表示
            let imagePickerController = UIImagePickerController()
            imagePickerController.sourceType = .PhotoLibrary
            imagePickerController.allowsEditing = true
            imagePickerController.delegate = self
            presentViewController(imagePickerController, animated: true, completion: nil)
        }
    }
func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {

        // 選択した画像・写真を取得し、imageViewに表示
        if let info = editingInfo, let editedImage = info[UIImagePickerControllerEditedImage] as? UIImage{
            ProfileImage.image = editedImage
        }else{
            ProfileImage.image = image
        }

        // フォトライブラリの画像・写真選択画面を閉じる
        picker.dismissViewControllerAnimated(true, completion: nil)

    }
// 画面が表示されたときのアクション
    override func viewWillAppear(animated: Bool) {

        // NSUserDefaultsクラスを呼び出す
        //standardUserDefaults():ユーザーデフォルトを準備
        let profile = NSUserDefaults.standardUserDefaults()
        let profileSex = NSUserDefaults.standardUserDefaults()

        // stringForKey:データを読み込む
        let myData = profile.stringForKey("myName")
        let myDataSex = profileSex.stringForKey("mySex")

        //もし、文字が入っていたら表示
        if let myDisplay = myData {
            NameTextField.text = myDisplay
        }
        //もし、文字が入っていたら表示
        if let myDisplay = myDataSex {
            SexTextField.text = myDisplay
        }

    }

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

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {

        // 選択した画像・写真を取得し、imageViewに表示
        if let info = editingInfo, let editedImage = info[UIImagePickerControllerEditedImage] as? UIImage{
            ProfileImage.image = editedImage
        }else{
            ProfileImage.image = image
        }

        // UIImage => NSDataに変換してUserDefaultに保存
        let imageData = UIImageJPEGRepresentation(ProfileImage.image!, 1);
        NSUserDefaults.standardUserDefaults().setObject(imageData, forKey: "myImage")
        NSUserDefaults.standardUserDefaults().synchronize()

        // フォトライブラリの画像・写真選択画面を閉じる
        picker.dismissViewControllerAnimated(true, completion: nil)

    }
// 画面が表示されたときのアクション
    override func viewWillAppear(animated: Bool) {

        // NSUserDefaultsクラスを呼び出す
        //standardUserDefaults():ユーザーデフォルトを準備
        let profile = NSUserDefaults.standardUserDefaults()

        // stringForKey:データを読み込む
        let myData = profile.stringForKey("myName")
        let myDataSex = profile.stringForKey("mySex")

        if let imageData = profile.objectForKey("myImage") as? NSData, image = UIImage(data: imageData) {
            // UserDefaultsから画像が取得出来た場合ImageViewのimageに設定
            ProfileImage.image = image

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

import UIKit

class ViewController: UIViewController {

    // Storyboard UIImageView
    @IBOutlet weak var loadImageView: UIImageView!

    // NSUserDefault Instance
    let userDefaults = NSUserDefaults.standardUserDefaults()

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func pushSaveButton(sender: UIButton) {

        // UIImage => NSDataに変換してUserDefaultに保存
        if let image = UIImage(named: "image") {
            let imageData = UIImageJPEGRepresentation(image, 1);
            userDefaults.setObject(imageData, forKey: "imageData")
            userDefaults.synchronize()
        }
    }


    @IBAction func pushLoadButton(sender: UIButton) {

        if let imageData = userDefaults.objectForKey("imageData") as? NSData, image = UIImage(data: imageData) {
            // UserDefaultsから画像が取得出来た場合ImageViewのimageに設定
            loadImageView.image = image
        }
    }
}

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

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {

    // 選択した画像・写真を取得し、imageViewに表示
    if let info = editingInfo, let editedImage = info[UIImagePickerControllerEditedImage] as? UIImage{
        ProfileImage.image = editedImage
    }else{
        ProfileImage.image = image
    }

    // UIImage => NSDataに変換してUserDefaultに保存
    let imageData = UIImageJPEGRepresentation(ProfileImage.image, 1);
    userDefaults.setObject(imageData, forKey: "imageData")
    userDefaults.synchronize()

    // フォトライブラリの画像・写真選択画面を閉じる
    picker.dismissViewControllerAnimated(true, completion: nil)
}

// 画面が表示されたときのアクション
override func viewWillAppear(animated: Bool) {

    let profile = NSUserDefaults.standardUserDefaults()

    if let imageData = profile.objectForKey("imageData") as? NSData, image = UIImage(data: imageData) {
        // UserDefaultsから画像が取得出来た場合ImageViewのimageに設定
        loadImageView.image = image
    }
}

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

// NSUserDefaultsクラスを呼び出す
//standardUserDefaults():ユーザーデフォルトを準備
let profile = NSUserDefaults.standardUserDefaults()

// stringForKey:データを読み込む
let myData    = profile.stringForKey("myName")
let myDataSex = profile.stringForKey("mySex")

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/08 18:36 編集

    ご指摘ありがとうございます!
    実装できました。
    NSDataへの変換がわかりませんでした。

    Singletonが知りませんでした。
    勉強になりました。

    最終的に実装できたコードを質問文に追加しました。

    ありがとうございます。
    また、宜しくお願い致します。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • Swift 2

    1334questions

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