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

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

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

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

1305閲覧

アプリ起動時、カスタムのチェックボックスがRealmのデータと一致しない

shokoba58

総合スコア99

Realm

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2021/07/29 15:11

編集2021/07/30 01:08

前提・実現したいこと

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

ご教示いただけますと幸いです。よろしくお願いいたします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/07/29 18:52

CheckBox().isChecked = 〜 って、その場でチェックボックスのインスタンスを作って値を設定して捨ててますね…。
shokoba58

2021/07/30 01:11

ご指摘いただき、ありがとうございます。 該当コードを1行、削除しました。 よろしければ、初期表示時にカスタムチェックボックスをRealmのデータを反映して表示させる方法についても、教えていただけましたら幸いです。
hoshi-takanori

2021/07/30 01:15

そのためには TodoCell が CheckBox を持つ必要がありますが…。もしかして、checkBtn が実は CheckBox だったりしますか? だったら checkBtn の型を CheckBox に変更して cell.checkBtn.isChecked = item.check でいけるのでは。
shokoba58

2021/07/30 01:40

>だったら checkBtn の型を CheckBox に変更して cell.checkBtn.isChecked = item.check でいけるのでは。 出来ました! そもそも型指定が間違っていたようです。初歩的ミスでお恥ずかしいです。 教えていただき、ありがとうございました!
guest

回答1

0

自己解決

自己解決ではないのですが、解決済ステータスにするために記載します。

hoshi-takanoriさんより教えて頂いた方法ですが、

・TodoCellのcheckBtnの型をUIButton→CheckBox(UIButtonを継承したクラス)に変更
・ViewControllerのカスタムセル設定部分に「cell.checkBtn.isChecked = item.check」を追加

で解決しました。

投稿2021/07/30 04:11

編集2021/07/30 04:14
shokoba58

総合スコア99

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問