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

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

ただいまの
回答率

87.61%

【Swift】CoreDataを用いた画像の保存と読み込み

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,645

score 8

前提・実現したいこと

画像をCoreDataに保存し、アプリ再起動後にその画像を表示させたいです。
Swiftを始めて1ヶ月の初心者のため、ご教授いただけると幸いです。

【詳細】
Swiftで撮影した画像 or 端末のライブラリ画像をCoreDataに保存し、アプリ再起動後に保存した画像を再表示させる機能をつくっています。

以下のソースコードでは、エラーは発生していませんが、
画像を撮影 or 画像を選択後、アプリを再起動しても画像が表示されません。

また、アプリの動作は以下の通りです。

1.ボタンをタッチするとアクションシートが表示され、画像の取得方法を選択する。
2.画像を選択するとImageViewにその画像が表示される。
3.アプリを再起動すると、1で選択した画像が表示される。

【わかっていないこと】
・選択した画像は保存されているが、表示がうまくいっていないのか
・選択した画像がそもそも保存されていないのか

以下はCoreDataの詳細です。
CoreDataの詳細

該当のソースコード

import UIKit
import CoreData

class ViewController: UIViewController,UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @IBOutlet weak var imageView: UIImageView!
    @IBAction func actionSheet(_ sender: UIButton) {
        //アクションシート
        let actionSheet = UIAlertController(title: "", message: "画像を選んでください", preferredStyle: UIAlertController.Style.actionSheet)
        //カメラ
        let tappedCamera = UIAlertAction(title: "カメラで撮影する", style: UIAlertAction.Style.default, handler: {(action: UIAlertAction!) in self.takePhotos()
        })
        //ライブラリ
        let tappedLibrary = UIAlertAction(title: "ライブラリから選択する", style: UIAlertAction.Style.default, handler: {(action: UIAlertAction!) in self.choosePhotos()
        })
        //キャンセル
        let cancel = UIAlertAction(title: "キャンセル", style: UIAlertAction.Style.cancel, handler: {(action: UIAlertAction!) in print("キャンセル")
        })

        actionSheet.addAction(tappedCamera)
        actionSheet.addAction(tappedLibrary)
        actionSheet.addAction(cancel)

        present(actionSheet, animated: true, completion: nil)
    }

    //カメラを起動
    func takePhotos() {

        let camera = UIImagePickerController.SourceType.camera

        if UIImagePickerController.isSourceTypeAvailable(camera){
            let picker = UIImagePickerController()
            picker.sourceType = camera
            picker.delegate = self
            self.present(picker, animated: true, completion: nil)
        }
    }

    //ライブラリを起動
    func choosePhotos() {
        let photoPick = UIImagePickerController()
        photoPick.sourceType = .photoLibrary
        photoPick.delegate = self
        self.present(photoPick, animated: true, completion: nil)
    }

    //撮影した画像 or 選択した画像をimageViewに表示
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){

        let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
        self.imageView.image = image

    //画像をコアデータへ保存
        let photoCore = Photo(context: self.conText)
        let imageData = UIImage.pngData(image)
        photoCore.picture = imageData()
        (UIApplication.shared.delegate as! AppDelegate).saveContext()

        self.dismiss(animated: true, completion: nil)
    }

    var photo01:[Photo] = []
    var conText = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

    //画像の再表示
        let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Photo")
        do{
            photo01 = try conText.fetch(fetchRequest as! NSFetchRequest<NSFetchRequestResult>) as! [Photo]          
        }catch{

        }
    }

}

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

Swift: version 5.1 
Xcode: Version 11.1 (11A1027)
Mac OS: Mojave 10.14.6(18G103)

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

photo01 にデータを入れていますが、そのデータをUIImageViewに反映する処理が書がれていません。
その処理はあなたが書く必要があります。

また、NSFetchRequestの使い方が間違っています。
詳しくはこちらをご覧ください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/10/17 19:57

    MasakiHori様

    はじめまして。
    ご回答いただきありがとうございます。
    リンク先の記事を参考にさせていただきます。

    キャンセル

  • 2019/10/17 21:47

    MasakiHori様

    おかげさまで目的を達成することができました。
    ありがとうございます。

    また、リンク先の記事も非常にわかりやすく、大変参考になりました。
    MasakiHori様の書かれた他の記事も読ませていただきます。
    今回はありがとうございました。

    キャンセル

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

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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