🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Core Data

Core DataはAppleのOS X and iOSのためのオブジェクトモデリングと持続性を持ったフレームワークです。Xcodeはエンティティー、属性そして関係性を特定するためのオブジェクトモデルの編集機能を提供します。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

6280閲覧

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

sai0001

総合スコア9

Core Data

Core DataはAppleのOS X and iOSのためのオブジェクトモデリングと持続性を持ったフレームワークです。Xcodeはエンティティー、属性そして関係性を特定するためのオブジェクトモデルの編集機能を提供します。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2019/10/16 06:24

前提・実現したいこと

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

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

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

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

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

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

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

該当のソースコード

Swift

1 2import UIKit 3import CoreData 4 5class ViewController: UIViewController,UIImagePickerControllerDelegate, UINavigationControllerDelegate { 6 7 @IBOutlet weak var imageView: UIImageView! 8 @IBAction func actionSheet(_ sender: UIButton) { 9 //アクションシート 10 let actionSheet = UIAlertController(title: "", message: "画像を選んでください", preferredStyle: UIAlertController.Style.actionSheet) 11 //カメラ 12 let tappedCamera = UIAlertAction(title: "カメラで撮影する", style: UIAlertAction.Style.default, handler: {(action: UIAlertAction!) in self.takePhotos() 13 }) 14 //ライブラリ 15 let tappedLibrary = UIAlertAction(title: "ライブラリから選択する", style: UIAlertAction.Style.default, handler: {(action: UIAlertAction!) in self.choosePhotos() 16 }) 17 //キャンセル 18 let cancel = UIAlertAction(title: "キャンセル", style: UIAlertAction.Style.cancel, handler: {(action: UIAlertAction!) in print("キャンセル") 19 }) 20 21 actionSheet.addAction(tappedCamera) 22 actionSheet.addAction(tappedLibrary) 23 actionSheet.addAction(cancel) 24 25 present(actionSheet, animated: true, completion: nil) 26 } 27 28 //カメラを起動 29 func takePhotos() { 30 31 let camera = UIImagePickerController.SourceType.camera 32 33 if UIImagePickerController.isSourceTypeAvailable(camera){ 34 let picker = UIImagePickerController() 35 picker.sourceType = camera 36 picker.delegate = self 37 self.present(picker, animated: true, completion: nil) 38 } 39 } 40 41 //ライブラリを起動 42 func choosePhotos() { 43 let photoPick = UIImagePickerController() 44 photoPick.sourceType = .photoLibrary 45 photoPick.delegate = self 46 self.present(photoPick, animated: true, completion: nil) 47 } 48 49 //撮影した画像 or 選択した画像をimageViewに表示 50 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){ 51 52 let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage 53 self.imageView.image = image 54 55 //画像をコアデータへ保存 56 let photoCore = Photo(context: self.conText) 57 let imageData = UIImage.pngData(image) 58 photoCore.picture = imageData() 59 (UIApplication.shared.delegate as! AppDelegate).saveContext() 60 61 self.dismiss(animated: true, completion: nil) 62 } 63 64 var photo01:[Photo] = [] 65 var conText = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 66 67 override func viewDidLoad() { 68 super.viewDidLoad() 69 // Do any additional setup after loading the view. 70 71 //画像の再表示 72 let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Photo") 73 do{ 74 photo01 = try conText.fetch(fetchRequest as! NSFetchRequest<NSFetchRequestResult>) as! [Photo] 75 }catch{ 76 77 } 78 } 79 80}

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

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

投稿2019/10/17 09:08

MasakiHori

総合スコア3391

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

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

sai0001

2019/10/17 10:57

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

2019/10/17 12:47

MasakiHori様 おかげさまで目的を達成することができました。 ありがとうございます。 また、リンク先の記事も非常にわかりやすく、大変参考になりました。 MasakiHori様の書かれた他の記事も読ませていただきます。 今回はありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問