前提・実現したいこと
Realmを使用したTodoリストのiPhoneアプリを作っています。
カスタムセルにカスタムのチェックボックスをUIButtonで作成し、
チェックのON/OFFを切り替えると、Realm上のデータのBooleanのtrue/falseが切り替わるところまで作成済みです。
(trueがチェックOFF、falseがチェックONです)
しかし、アプリ起動時にそのデータが画面に反映されず、
全てのチェックボックスがOFFの状態になってしまっています。
起動時にもデータがきちんと反映されるようにしたいです。
発生している問題・エラーメッセージ
Realm上で「false(チェックON)」となっているデータが
画面上では「チェックOFF」のままになってしまっています。
該当のソースコード
念の為、該当箇所以外の部分も含めた該当クラス全体を記載しています。
見辛くて申し訳ありません。
swift
1//ViewConyroller.swift 2import UIKit 3import RealmSwift 4 5class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 6 7 var itemList: Results<TodoItem>! 8 let realm = try! Realm() 9 var token:NotificationToken! 10 var index = 0 11 12 @IBOutlet weak var tableView: UITableView! 13 14 override func viewDidLoad() { 15 16 // realmのリストを取得 17 itemList = realm.objects(TodoItem.self).sorted(byKeyPath: "date") 18 token = realm.observe{ notification, realm in 19 20 //変更があった場合にtableViewを更新 21 self.tableView.reloadData() 22 super.viewDidLoad() 23 } 24 } 25 26 func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 27 return true 28 } 29 30 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 31 if editingStyle == .delete { 32 InfoHelper().deleteItem(item: itemList[indexPath.row], token: token) 33 tableView.deleteRows(at: [indexPath], with: .automatic) 34 } 35 } 36 37 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 38 return itemList.count 39 } 40 41 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 42//カスタムセル設定部分です 43 let cell = tableView.dequeueReusableCell(withIdentifier: "todoCell", for: indexPath) as! TodoCell 44 let item = itemList[indexPath.row] 45 cell.todoId = item.id 46 cell.todoLabel.text = item.title 47 cell.tododate = item.date 48 49 return cell 50 } 51 52 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 53 54 } 55 56 func tableView(_ tableView: UITableView, didHighlightRowAt indexPath: IndexPath) { 57 index = indexPath.row 58 } 59 60 @IBAction func toEdit(_ sender: Any, indexPath: IndexPath) { 61 self.performSegue(withIdentifier: "toEdit", sender: index) 62 } 63 64 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 65 if segue.identifier == "toEdit" { 66 if let editView = segue.destination as? EditView{ 67 // 選択行の番号情報を編集画面に渡す 68 editView.todoIndex = index 69 } 70 } 71 } 72}
swift
1//TodoCell.swift カスタムセル設定クラス 2import UIKit 3 4class TodoCell:UITableViewCell { 5 6 @IBOutlet weak var checkBtn: UIButton! 7 @IBOutlet weak var todoLabel: UILabel! 8 @IBOutlet weak var infoBtn: UIButton! 9 10 var todoIndex = 0 11 var todoId = "" 12 var tododate = Date() 13 14 @IBAction func checkView(_ sender: CheckBox) { 15 16 let check:Bool = sender.isChecked 17 18 InfoHelper().update(id:todoId,title:todoLabel.text!, date:tododate, check: check) 19 20 } 21} 22
swift
1//CheckBox.swift カスタムチェックボックス設定クラス 2import UIKit 3 4class CheckBox: UIButton { 5 // Images 6 let checkedImage = UIImage(named: "check_on")! as UIImage 7 let uncheckedImage = UIImage(named: "check_off")! as UIImage 8 9 // Bool property 10 var isChecked: Bool = false { 11 didSet{ 12 if isChecked == true { 13 self.setImage(checkedImage, for: UIControl.State.normal) 14 } else { 15 self.setImage(uncheckedImage, for: UIControl.State.normal) 16 } 17 } 18 } 19 20 override func awakeFromNib() { 21 self.addTarget(self, action:#selector(buttonClicked(sender:)), for: UIControl.Event.touchUpInside) 22 self.isChecked = false 23 } 24 25 26 27 @objc func buttonClicked(sender: UIButton) { 28 if sender == self { 29 isChecked = !isChecked 30 } 31 } 32} 33
試したこと
・Realmへの反映を確認
・StoryBoardへの紐付けを確認
・「カスタムセル設定部分」の処理の最後に「print(item.check)」のデバッグコードを書き、
来ているデータがRealmと一致してるか確認→問題なし
補足情報(FW/ツールのバージョンなど)
Swift 5.4
Xcode 12.5.1
ご教示いただけますと幸いです。よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー