Realmで保存したString型の配列にある写真の値をloop文で回しながらUIImage型に変換して、UICollectionViewCellに値を格納したい。
こんにちは、質問失礼致します。
現在、Realmのファイルに保存されているデータを取得し、そのデータの中に保存されているimageString
という変数に写真のデータがString型の配列で保存されているので、String型の配列にあるデータをloop文で回し、 base64
を使用してUIImage型の配列に変換し、UICollectionViewのcellにUIImageViewがあるので、そこのimageViewに値を入れたいと考えています。
該当のソースコード
swift
import UIKit import RealmSwift import SVProgressHUD class CategoryPhotoUpViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource { @IBOutlet weak var categoryCollectionView: UICollectionView! let realm = try! Realm() var morningArray = try! Realm().objects(Morning.self).sorted(byKeyPath: "id", ascending: false) var categoryXib: XibCategoryPhotoView! override func viewDidLoad() { // もしmorningArrayの数が0だったら遷移元の画面に戻る if morningArray.count == 0 { self.navigationController?.popViewController(animated: true) } print("DEBUG_PRINT: morningControllerが表示されました") print("DEBUG_PRINT: (morningArray.count)") categoryCollectionView.delegate = self categoryCollectionView.dataSource = self categoryXib = XibCategoryPhotoView() categoryCollectionView.reloadData() } override func didReceiveMemoryWarning() { } override func viewWillAppear(_ animated: Bool) { categoryCollectionView.reloadData() print("DEBUG_PRINT: 画面を更新します") } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { print("DEBUG_PRINT: 数を返します") return morningArray.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = categoryCollectionView.dequeueReusableCell(withReuseIdentifier: "Cell2", for: indexPath) as! CategoryCollectionViewCell if morningArray.count == 0 { print("DEBUG_PRINT: morningArrayのデータが0です") } else if morningArray.count > 0 { print("DEBUG_PRINT: morningArrayのデータが0以上です") for morningArrayValue in morningArray { for imageStringer in morningArrayValue.imageString { var image: UIImage image = UIImage(data: Data(base64Encoded: String(imageStringer), options: .ignoreUnknownCharacters)!)! cell.imageView.image = image print("DEBUG_PRINT: cellのイメージに値をセットしました。") print("DEBUG_PRINT: (String(describing: cell.imageView.image))") } } } return cell } // セルサイズの自動変更を設定する func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { let width: CGFloat = view.frame.width / 3 - 1 // self.viewを/3し、-1は隙間の部分 let height: CGFloat = width return CGSize(width: width, height: height) } }
試したこと
for loop文でRealmからデータを取得している変数 morningArray
を回しており、次のfor文で morningArray
から取得したデータ morningArrayValue
に imageString
のデータを与え回しています。変数 imageStringer
に base64
を使用しUIImage型に変換しようと考えています.
シグバートエラーが image = UIImage(data: Data(base64Encoded: String(imageStringer), options: .ignoreUnknownCharacters)!)!
の部分で出ています。
デバックエリアはこのようになっていて、imageに何かしらの値は入ってるように感じるのですが、imageにString型のデータをUIImage型に変換して入れようとするところで止まってしまいます。これはなぜ変数imageにUIImage型で値が入らないのでしょうか?基本的には1つ上の部分のif文で morningArray
の数が0以上であることは確認してあるのでnilが入ることはないと思ってるのですが、何かコードに不備があるのでしょうか?
ご存知の方がいらっしゃったらご教授いただけるとありがたいです。
初心者なので至らない点もあると思いますがよろしくお願い致します。
補足情報(FW/ツールのバージョンなど)
Xcode Version 9.3.1
よろしくお願い致します。
追記
import RealmSwift class Morning: Object { // 管理用 ID。プライマリーキー @objc dynamic var id = 0 // 投稿ID @objc dynamic var postID = "" // UserName @objc dynamic var userName = "" // ImageString @objc dynamic var imageString = "" // caption @objc dynamic var caption = "" // date @objc dynamic var time = "" override static func primaryKey() -> String? { return "id" } }
// Date.timeIntervalSinceReferenceDateメソッドだけを取り出し、コードの量を減らす let timer = Date.timeIntervalSinceReferenceDate // もしもMorningSwitchがtrueだったら if morningSwitch.isOn == true { let morning = Morning() morning.time = String(timer) let morningArray = realm.objects(Morning.self) // もしもmorningArrayのcountプロパティが0じゃなかったら if morningArray.count != 0 { morning.id = morningArray.max(ofProperty: "id")! + 1 } try! realm.write { // タグmorningに投稿情報が保存される時 morning.caption = self.textField.text! morning.userName = (Auth.auth().currentUser?.displayName!)! morning.imageString = imageData!.base64EncodedString(options: .lineLength64Characters) // 日付の値を取得する morning.time = String(timer) realm.add(morning, update: true) } }
まだ回答がついていません
会員登録して回答してみよう