前提・実現したいこと
CollectionViewとInputViewという2つの画面をもつアプリで、
InputViewで名前や写真を入力して完了ボタンを押すと、collectionViewで登録された情報が一覧で見れるようにしたいです。
発生している問題・エラーメッセージ
完了ボタンを押してCollectionViewに戻ると、データ数は増えているが、全て空の状態になっている
該当のソースコード
Teammate
1import Foundation 2import RealmSwift 3 4class Teammate: Object { 5 // ID 6 dynamic var id = 0 7 // 名前 8 dynamic var name = "" 9 // 写真 10 dynamic var photo = Data() 11}
InputViewController
1import UIKit 2import RealmSwift 3 4class InputViewController: UIViewController, UIImagePickerControllerDelegate & UINavigationControllerDelegate { 5 6 @IBOutlet weak var imageView: UIImageView! 7 @IBOutlet weak var infoView: UIView! 8 @IBOutlet weak var nameText: UILabel! 9 10 var name = "" 11 var imagePhoto: UIImage! 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 // Do any additional setup after loading the view. 16 17 } 18 19 @IBAction func tapAction(_ sender: Any) { 20 if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) { 21 // 写真を選ぶビュー 22 let pickerView = UIImagePickerController() 23 // 写真の選択元をカメラロールにする 24 pickerView.sourceType = .photoLibrary 25 // デリゲート 26 pickerView.delegate = self 27 //編集を可能にする 28 pickerView.allowsEditing = true 29 // ビューに表示 30 self.present(pickerView, animated: true) 31 } 32 } 33 34 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 35 if info[UIImagePickerController.InfoKey.originalImage] != nil { 36 // 選択した写真を取得する 37 let image = info[UIImagePickerController.InfoKey.editedImage] as! UIImage 38 // ビューに表示する 39 imageView.image = image 40 imagePhoto = image 41 // 写真を選ぶビューを引っ込める 42 self.dismiss(animated: true) 43 } 44 } 45 46 //登録ボタン 47 @IBAction func okayBtnAction(_ sender: Any) { 48 //データの更新 49 let realm = try! Realm() 50 let newData = Teammate() 51 try! realm.write { 52 newData.name = nameText.text! 53 newData.photo = imagePhoto.jpegData(compressionQuality: 0.5)! as Data 54 realm.add(newData) 55 print(newData.name) 56 print(newData.photo) 57 } 58 self.dismiss(animated: true, completion: nil) 59 } 60 61 @objc func changeName(nm: String){ 62 nameText.text = nm 63 }
InfoViewController
1import UIKit 2 3class InfoViewController: UIViewController { 4 5 @IBOutlet weak var nameTextField: UITextField! 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 nameTextField.addTarget(self, action: #selector(changeText), for: .editingChanged) 10 11 // Do any additional setup after loading the view. 12 } 13 14 @objc func changeText(){ 15 let parent = self.parent as! InputViewController 16 parent.changeName(nm: nameTextField.text!) 17 parent.name = nameTextField.text! 18 }
ViewController
1import UIKit 2import Charts 3import RealmSwift 4 5class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { 6 7 @IBOutlet weak var collectionView: UICollectionView! 8 9 //Realmインスタンスを取得 10 let realm = try! Realm() 11 12 //Teammateが格納されているリスト 13 var teammate = try! Realm().objects(Teammate.self) 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 // Do any additional setup after loading the view. 18 collectionView.dataSource = self 19 20 for human in teammate { 21 print("name: (human.name)") 22 } 23 24 // レイアウトを調整 25 let layout = UICollectionViewFlowLayout() 26 27 layout.sectionInset = UIEdgeInsets(top: 15, left: 15, bottom: 15, right: 15) 28 collectionView.collectionViewLayout = layout 29 } 30 31 //セル表示数 32 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 33 // 表示するセルの数 34 return teammate.count 35 } 36 37 //各セルの内容を返すメソッド 38 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 39 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! CollectionViewCell 40 let person = teammate[indexPath.row] 41 //写真のデータ型の変換 42 var imageData: UIImage? = UIImage(data: person.photo as Data) 43 if imageData == nil { 44 imageData = UIImage(named: "sample") 45 } 46 //Cellにセット 47 cell.setup(name: person.name, icon: imageData!) 48 // セルの色 49 //cell.backgroundColor = .lightGray 50 return cell 51 } 52 53 //デザイン 54 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 55 let horizontalSpace : CGFloat = 20 56 let cellSize : CGFloat = self.view.bounds.width / 3 - horizontalSpace 57 return CGSize(width: cellSize, height: cellSize) 58 } 59 60 //入力画面から返ってきたときにCollectionViewを更新 61 override func viewWillAppear(_ animated: Bool) { 62 super.viewWillAppear(animated) 63 collectionView.reloadData() 64 } 65}
CollectionViewCell
1import UIKit 2 3class CollectionViewCell: UICollectionViewCell { 4 @IBOutlet weak var cellName: UILabel! 5 @IBOutlet weak var cellImage: UIImageView! 6 7 func setup(name: String, icon: UIImage){ 8 cellName.text = name 9 cellImage.image = icon 10 } 11}
試したこと
Realm Studioを使ってデータを確認しましたが、全て空でした
補足情報(FW/ツールのバージョンなど)
iOS 14.3
Xcode 12.3
RealmSwift 10.5.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/24 23:46 編集
2021/01/25 00:04
2021/01/25 09:07
2021/01/25 09:29
2021/01/25 09:44
2021/01/25 13:56