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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Realm

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

解決済

Realmで保存したString型の配列にある写真の値をloop文で回しながらUIImage型に変換をし、UICollectionViewCellに値を格納したい

crea7dosSantos
crea7dosSantos

総合スコア17

Realm

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

1回答

0評価

0クリップ

81閲覧

投稿2018/05/14 01:56

編集2018/05/14 13:04

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から取得したデータ morningArrayValueimageStringのデータを与え回しています。変数 imageStringerbase64 を使用し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) } }

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Realm

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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