質問編集履歴

1 ソースコードの追加

crea7dosSantos

crea7dosSantos score 7

2018/05/14 22:04  投稿

Realmで保存したString型の配列にある写真の値をloop文で回しながらUIImage型に変換をし、UICollectionViewCellに値を格納したい
### 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)!)!` の部分で出ています。
![![イメージ説明](3399675fb41c3e36679178ff83df621e.jpeg)](37c5b94522803ed3605c54385973a597.jpeg)
デバックエリアはこのようになっていて、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)
     }
   }
```
  • iOS

    4674 questions

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

  • Swift

    8715 questions

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

  • Realm

    258 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る