作りたいもの
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フォルダにも画像は保存できています
参考にしたサイト
回答1件
あなたの回答
tips
プレビュー