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

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

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

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

解決済

tableViewCell 左端のチェックマークを維持したい。

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

1回答

0リアクション

0クリップ

5366閲覧

投稿2018/07/21 22:56

編集2018/07/23 21:56

いつもお世話になります。

常時並び替え可能なテーブルビューにチェックマークを設定したところ、並び替え処理後に、チェックマークが維持できなくて困っています。
TableViewリロード時に、チェックマークが維持できなくて困っています。

UserDefaultなどをつかった、チェック済セルの永続化に必要なので、
tableView.allowsMultipleSelectionDuringEditing = true に設定した際にチェックマークの状態を示すセルのプロパティ名をご存知でしたら教えてください。

以前教えていただいたUILabelを使用して作ったものを、このチェックマークに置き換えたいと思うのですが、そもそも、このチェックマークの使い道自体が間違っているのでしょうか?

swift

import UIKit class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { var typesOfCatsArray: [String] = ["ジバニャン", "ワルニャン", "フユニャン", "イヌニャン", "サルニャン", "イチゴニャン"] // 選択済みの猫の種類を記憶する配列 var selectedCatsArray: [String] = [] @IBOutlet weak var typeOfCatsTableView: UITableView! //MARK: - LifeCycle - override func viewDidLoad() { super.viewDidLoad() // tableViewの編集を可能にする typeOfCatsTableView.isEditing = true //typeOfCatsTableView.allowsSelectionDuringEditing = true typeOfCatsTableView.allowsMultipleSelectionDuringEditing = true } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } //MARK: - UITableViewDataSource - // numberOfCell func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return typesOfCatsArray.count } // generateCell func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) let typeOfCatStr = typesOfCatsArray[indexPath.row] // typeOfCatsTableView.reloadData()時に、ここで選択済み配列に入っている猫の種類Cellにチェックマークを付けたいが記述方法がわからない。 if selectedCatsArray.contains(typeOfCatStr) == true { //cell.isSelected = true } else { //cell.isSelected = false } cell.textLabel!.text = typeOfCatStr return cell } //MARK: - UITableViewDelegate - // selectCell func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let selectedCatStr = typesOfCatsArray[indexPath.row] if selectedCatsArray.contains(selectedCatStr) == false { // 選択済み猫の種類を保存する selectedCatsArray.append(selectedCatStr) // 他のTableViewの配列に値を格納する } } // deselectCell func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { let deselectedCatStr = typesOfCatsArray[indexPath.row] if let deleteCatIndex = selectedCatsArray.index(of: deselectedCatStr) { // 選択済み猫の種類を解除する selectedCatsArray.remove(at: deleteCatIndex) // 他のTableViewの配列から値を削除する } } // sortable func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { return true } // editArray func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { let targetCatStr = typesOfCatsArray[sourceIndexPath.row] typesOfCatsArray.remove(at: sourceIndexPath.row) typesOfCatsArray.insert(targetCatStr, at: destinationIndexPath.row)      // リロードを呼ばなければチェックマークが維持される。      typeOfCatsTableView.reloadData() } }

イメージ説明

↓UILabelを使用して作ったもの。

イメージ説明

swift

//簡素化したコード。これ以外は、StoryboardにTableView・Cellを配置してCellのidentifierを設定、TableViewをOutlet接続しただけです。 import UIKit class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { var typesOfCatsArray: [String] = ["ジバニャン", "ワルニャン", "フユニャン", "イヌニャン", "サルニャン", "イチゴニャン"] @IBOutlet weak var typeOfCatsTableView: UITableView! //MARK: - LifeCycle - override func viewDidLoad() { super.viewDidLoad() // tableViewの編集を可能にする typeOfCatsTableView.isEditing = true //typeOfCatsTableView.allowsSelectionDuringEditing = true typeOfCatsTableView.allowsMultipleSelectionDuringEditing = true } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } //MARK: - UITableViewDataSource - // numberOfCell func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return typesOfCatsArray.count } // generateCell func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) cell.textLabel!.text = typesOfCatsArray[indexPath.row] return cell } // sortable func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { return true } // editArray func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { let targetCatStr = typesOfCatsArray[sourceIndexPath.row] typesOfCatsArray.remove(at: sourceIndexPath.row) typesOfCatsArray.insert(targetCatStr, at: destinationIndexPath.row) typeOfCatsTableView.reloadData() } }

解決方法備忘録

swift

// generateCell func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = typeOfCatsTableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) let typeOfCatStr = typesOfCatsArray[indexPath.row] // typeOfCatsTableView.reloadData()時に、ここで選択済み配列に入っている猫の種類をselectする print("selectedCatsArray:",selectedCatsArray) if selectedCatsArray.contains(typeOfCatStr) == true { typeOfCatsTableView.selectRow(at: indexPath, animated: false, scrollPosition: .none) } else { typeOfCatsTableView.deselectRow(at: indexPath, animated: false) } cell.textLabel!.text = typeOfCatStr return cell } コード

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

fuzzball

2018/07/23 00:17

質問のコードではチェックマークの表示/非表示のコードが無いですよね?でもgifにはチェックマークが付いているし?何を質問しているのでしょうか?
退会済みユーザー

退会済みユーザー

2018/07/23 00:23

返信ありがとうございます。そうなんです。チェックマークの表示/非表示のコードを記述しなくても、チェック機能が動いているので、どの部分がチェック機能を担っているのかわからなくて困っています。
退会済みユーザー

退会済みユーザー

2018/07/23 00:27

通常、didselect内でセルに行った変更をcellForRowAt内でリロード時に適用して上げればよいのかと思いますが…。この場合、didselect内で何も処理をしなくてもチェックマークがついてしまうので…。
fuzzball

2018/07/23 00:37

いや、押したときの表示/非表示の処理ではなく、チェックマークそのものの表示/非表示のコードのことを言ってます。
退会済みユーザー

退会済みユーザー

2018/07/23 00:46 編集

お手数おかけします。チェックマークそのものの表示/非表示をどうやっているのかがわからないのです。viewDidLoad内で、tableViewのプロパティを2つtrueにしてあげたところ、チェックボックスがセルの左側に表示さえれて、タップするだけで、チェックマークがつくようになったので…。どうやってチェックを付けているかがわからないのです。チェックをつけるコードがわかれば、チェックを自分で操作できると思うのですが...。
fuzzball

2018/07/23 00:54

えと、表示/非表示と書いたのが悪かったかもしれません。表示です。チェックマークはどうやって(どこで)表示しているのでしょうか?
退会済みユーザー

退会済みユーザー

2018/07/23 00:58 編集

コード的には何も書いていないのです。cell.accessoryType = .checkmarkとか一切書いてないのです。なのでそもそもの使いみちが違うものなのかと…。チェックが付くだけのコードも載せたいと思います。
fuzzball

2018/07/23 01:10

すみません、理解しました。チェックマークは自前で表示しているのではないんですね。こういうのがあることを知りませんでした。(ようするに、前回の回答は間違っていたということですね)
退会済みユーザー

退会済みユーザー

2018/07/23 01:12

いや、コードでチェックが制御できない以上、これは使いみちがちがうんじゃないかと思っているのですが、使えたらメンテがらくになるなと。cellがタップされたときに何が行われているか監視できたりすればわかるかなと思ってみたり。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Swift

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