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

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

詳細はこちら
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Xcode

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

Swift

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

Q&A

解決済

1回答

3211閲覧

swift realmに画像のパスを保存し表示したい

kazuma-shino

総合スコア1

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/02/04 16:06

作りたいもの

swiftとrealmを使って、チケットの写真を撮り、リスト形式で画像を表示するアプリ

実現したいこと

realmにファイルパスを保存して画像を表示したい、もしくは他の実装方法を知りたい

現在の状況

realmにファイルパスの保存はできたが、画像が表示されない

//Ticket.swift import Foundation import UIKit import RealmSwift class Ticket:Object{ @objc dynamic var name = "" @objc dynamic var selectedDate = "" @objc dynamic var imageURL = "" }

画像の追加をするView

import UIKit import RealmSwift import WeScan class AddTicketViewController: UIViewController { @IBOutlet weak var placeNameTextField: UITextField! @IBOutlet weak var adressTextField: UITextField! @IBOutlet weak var dateTextFiled: UITextField! @IBOutlet weak var ticketImageView: UIImageView! @IBOutlet weak var cameraButton: UIButton! @IBOutlet weak var albumButton: UIButton! var datePicker: UIDatePicker = UIDatePicker() let realm = try! Realm() // ドキュメントディレクトリの「ファイルURL」(URL型)定義 var documentDirectoryFileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] // ドキュメントディレクトリの「パス」(String型)定義 let filePath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] override func viewDidLoad() { super.viewDidLoad() //日付選択 datePicker = makeDatePicker() dateTextFiled.inputView = datePicker let toolbar = makeToolBar() dateTextFiled.inputAccessoryView = toolbar //ボタンの装飾 cameraButton.layer.borderWidth = 1 cameraButton.layer.cornerRadius = 5 albumButton.layer.borderWidth = 1 albumButton.layer.cornerRadius = 5 } @IBAction func addTicket(_ sender: Any) { saveImage() let ticket = Ticket() ticket.name = placeNameTextField.text! ticket.selectedDate = dateTextFiled.text! do{ try ticket.imageURL = documentDirectoryFileURL.absoluteString }catch{ print("画像の保存に失敗しました") } try! realm.write{realm.add(ticket)} dismiss(animated: true, completion: nil) } @IBAction func cancel(_ sender: Any) { dismiss(animated: true, completion: nil) } @IBAction func onCamera(_ sender: Any) { startCamera() } @IBAction func onAlbum(_ sender: Any) { openLibrary() } //カメラの起動 func startCamera() { let scannerViewController = ImageScannerController() scannerViewController.imageScannerDelegate = self present(scannerViewController, animated: true) } //アルバムの起動 func openLibrary() { let imagePicker = UIImagePickerController() imagePicker.delegate = self imagePicker.sourceType = .photoLibrary present(imagePicker, animated: true) } //②保存するためのパスを作成する func createLocalDataFile() { // 作成するテキストファイルの名前 let fileName = "(NSUUID().uuidString).png" // DocumentディレクトリのfileURLを取得 if documentDirectoryFileURL != nil { // ディレクトリのパスにファイル名をつなげてファイルのフルパスを作る let path = documentDirectoryFileURL.appendingPathComponent(fileName) documentDirectoryFileURL = path } } //画像を保存する関数の部分 func saveImage() { createLocalDataFile() //pngで保存する場合 let pngImageData = ticketImageView.image?.pngData() do { try pngImageData!.write(to: documentDirectoryFileURL) } catch { //エラー処理 print("エラー") } } }

リストのView

import UIKit import RealmSwift extension ViewController :UIAdaptivePresentationControllerDelegate{ func presentationControllerDidDismiss(_ presentationController: UIPresentationController) { ticketListTableView.reloadData() } } class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource{ @IBOutlet weak var ticketListTableView: UITableView! var ticketData:Results<Ticket>! var screenWidth:CGFloat = 0 var screenHeight:CGFloat = 0 override func viewDidLoad() { super.viewDidLoad() ticketListTableView.delegate = self ticketListTableView.dataSource = self //xibの読み込み ticketListTableView.register(UINib(nibName: "TicketTableViewCell", bundle: nil), forCellReuseIdentifier: "TicketTableViewCell") let realm = try! Realm() ticketData = realm.objects(Ticket.self) // 画面の幅を取得 screenWidth = view.frame.size.width screenHeight = view.frame.size.height //plusボタンの生成 let addButton = UIButton() addButton.frame = CGRect(x: screenWidth * 0.75, y: screenHeight * 0.75, width: screenWidth/6, height: screenWidth/6) addButton.setImage(UIImage(named: "plus5"), for: .normal) // ViewにButtonを追加 self.view.addSubview(addButton) // タップされたときのactionをセット addButton.addTarget(self, action: #selector(ViewController.buttonTapped(_sender:)),for: .touchUpInside) } @objc func buttonTapped(_sender : Any){ let addTicketVC = storyboard?.instantiateViewController(identifier: "AddTicketVC") as! AddTicketViewController addTicketVC.presentationController?.delegate = self present(addTicketVC, animated: true, completion: nil) } func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return ticketData.count } //セルの表示 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "TicketTableViewCell",for: indexPath) as! TicketTableViewCell cell.placeNameLabel.text = ticketData[indexPath.row].name cell.dateLabel.text = ticketData[indexPath.row].selectedDate //画像の処理 cell.TicketImageView.image = UIImage(contentsOfFile: ticketData[indexPath.row].imageURL) return cell } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return ticketListTableView.contentSize.height*0.8 } //編集の許可 func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { return true }

imageURLにはfile:///var/mobile/Containers/Data/Application/E5CCB5C2-09E9-455E-9800-2F1BDBEF415C/Documents/D22C6285-F0C6-4C67-AFB3-0B9B5925C939+.pngと保存されており、Documentsフォルダにも画像は保存できています

参考にしたサイト

https://qiita.com/ryomaDsakamoto/items/ab8e5cd9da1ea70f3302

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

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

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

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

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

hoshi-takanori

2021/02/04 18:30

UIImage(contentsOfFile:) の引数はパスなのに、URL を渡してるからでは。
kazuma-shino

2021/02/05 01:39 編集

ありがとうございます URLとpathは別物だったのですね 無事表示できましたので、今回は自己解決ということで質問を閉じさせていただきます
guest

回答1

0

自己解決

//ViewController let fileURL = URL(string: ticketData[indexPath.row].imageURL) let filePath = fileURL?.path //画像の処理 cell.ticketImageView.image = UIImage(contentsOfFile: filePath!)

String型で保存されているファイルURLをURL型にキャストして、ファイルパスに変換しました

投稿2021/02/05 01:42

kazuma-shino

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問