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

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

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

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

Xcode

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

Swift

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

Q&A

解決済

1回答

652閲覧

TableViewのCellにチェックマークを実装したが、画面遷移を行うとチェックマークが外れてしまう

hik_

総合スコア42

iOS

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

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/12/04 13:27

前提・実現したいこと

学習の為、ToDoアプリを作っているのですが、TableViewのCellにチェックマークをつけれる機能の実装を行いたいです。

発生している問題・エラーメッセージ

チェックマークを付ける、外す機能は実装出来たのですが、チェックマークを付けた状態で画面遷移を行うとチェックマークが消えてしまいます。

該当のソースコード

ViewController.swift import UIKit class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { @IBOutlet weak var tableView: UITableView! // チェックマークの処理 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let Cell = tableView.cellForRow(at: indexPath) Cell?.accessoryType = .checkmark } // チェックマークの処理 func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { let Cell = tableView.cellForRow(at: indexPath) Cell?.accessoryType = .none } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return todobox.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let ToDoCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "ToDoCell", for: indexPath) ToDoCell.textLabel!.text = todobox[indexPath.row] return ToDoCell } override func viewDidLoad() { super.viewDidLoad() tableView.delegate = self tableView.dataSource = self tableView.allowsMultipleSelection = true if UserDefaults.standard.object(forKey: "ToDoList") != nil { todobox = UserDefaults.standard.object(forKey: "ToDoList") as! [String] } } }
AddViewController.swift import UIKit var todobox = [String]() class AddViewController: UIViewController { // テキストフィールド @IBOutlet weak var textField: UITextField! // 追加ボタン @IBAction func addButton(_ sender: Any) { todobox.append(textField.text!) textField.text = "" UserDefaults.standard.set(todobox, forKey: "ToDoList") } override func viewDidLoad() { super.viewDidLoad() } }

試したこと

チェックマークの情報をUserDefaultsを使って保存すると解決するかもしれない事は分かり、試しており
調べているのですが、解決には至っていません。
ご教示頂けると幸いです。
宜しくお願いします。

補足情報(FW/ツールのバージョンなど)

Swift4 Xcode10

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

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

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

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

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

guest

回答1

0

ベストアンサー

セルの再描画が必要な時は cellForRowAt が呼び出されますが、これはTableView全体が再描画(画面遷移も同様)される時や、セル行をスクロールして一度画面外に追い出した後また戻ってきた場合でも、対象セルについて呼び出しがあります。
つまり cellForRowAt でセルの設定を行ったときに、チェック状態も設定しなければなりません。でなければ初期状態に戻ってしまいます。

didSelectRowAtなどでセルの表示を変更するためでなく、内部でもその状態の保持が必要です。
(メモリで済ませるのか、あるいはUserDefaultsなどに保存するのかはアプリ次第です)

投稿2018/12/04 13:52

daisuke7

総合スコア1563

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

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

hik_

2018/12/04 14:23

ご回答ありがとうございます。 AddViewController.swiftにある、 var todo box = [String]()のようにチェック状態を保存する変数を用意して、 UserDefaults.standard.set(todobox, forKey: "ToDoList") のようにチェック状態を保存した変数の中身をUserDefaultsに保存するという流れでしょうか?
daisuke7

2018/12/04 14:58

とりあえずはそれでも良いかもしれませんが、データ一件ごとの属性が増えてくるとめんどくさくなるので考慮は必要です。
hik_

2018/12/06 12:46

ご返信ありがとうございます。データ一軒ごとの属性が増えてくるとめんどくさくなる というのは、Cellが増えると容量が圧迫される?という事でしょうか?またメモリとUserDefaultsの違いはメモリは端末の容量という事なのでしょうか? 初心者の為、質問におかしい点がありましたら、すみません。
daisuke7

2018/12/06 12:52

メモリというのは要するにRAMです。UserDefaultsは要するにストレージです。アプリが再起動しても状態を保存したいなら最終的にはストレージに保存が必要でしょう。 面倒ってのは、たとえばtodo情報に「日付」とか「繰り返し」とか「色」とかどんどん属性が増えてきたときに、それらをすべて別の配列で用意するのはいろいろ面倒じゃないですか?って意味です。
hik_

2018/12/06 13:05

ご返信ありがとうございます。 分かりやすくありがとうございます。 例えば色々な属性のデータを扱うのであれば、UserDefaultsよりCoreDateの方が適切でしょうか?
daisuke7

2018/12/06 13:08

うーん、それはなんとも言えませんし、ここで考える話でもないと思います。
hik_

2018/12/06 13:24

ご返信ありがとうございます。 分かりました。詳しく教えてくださり、ありがとうございます。 色々と勉強してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問