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

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

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

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

Q&A

解決済

2回答

803閲覧

iOSアプリでtableViewのCellをタップ時に背景色を変更とクリア

yamayamak

総合スコア131

Swift

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

0グッド

0クリップ

投稿2017/10/04 12:10

iPhoneアプリを作っているのですが、tableViewのCellを押した時に背景色をclearとlightGrayを入れ替えたいのですが、うまく行きません。押した時にlightGrayにはなりますが、再度押してもclearされません。
printすると


タップされたセルのindex番号false: 1
タップされたセルのindex番号true: 1


と交互に処理が実行されているのに、なぜ、
cell.backgroundColor = UIColor.clear
で色が透明に戻らないのかご教授下さい。
(sigDataArrayは配列でcell毎のデータを格納しています。)

swift

1// セルがタップされた時の処理 2func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 3 tableView.deselectRow(at: indexPath, animated: false) 4 let cell = tableView.dequeueReusableCell(withIdentifier: "irSigCell", for: indexPath) 5 // 状態と色を変更する 6 if (sigDataArray[indexPath.row].tapSelect)! { 7 sigDataArray[indexPath.row].tapSelect = false 8 cell.backgroundColor = UIColor.clear 9 print("タップされたセルのindex番号true: (indexPath.row)") 10 } else { 11 sigDataArray[indexPath.row].tapSelect = true 12 cell.backgroundColor = UIColor.lightGray 13 print("タップされたセルのindex番号false: (indexPath.row)") 14 } 15}

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

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

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

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

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

guest

回答2

0

ベストアンサー

現在表示されているセルを直接変更すると、セルが再利用されたときに表示がおかしくなる(セル数を増やしてスクロールさせると分かります)ので、下記のような処理にしないといけません。

セルの再生成について調べることをお勧めします。

タップ時

tableView(_:didSelectRowAt:)では、フラグの変更とセルの更新を行います。

swift

1//状態変更 2if (sigDataArray[indexPath.row].tapSelect)! { 3 //選択中 → 未選択 4 sigDataArray[indexPath.row].tapSelect = false 5} else { 6 //未選択 → 選択中 7 sigDataArray[indexPath.row].tapSelect = true 8} 9//セル更新 10tableView.reloadRows(at: [indexPath], with: .automatic) //アニメーションの種類はお好みで
セル生成

tableView(_:cellForRowAt:)では、フラグを参照して背景色を設定します。

swift

1if (sigDataArray[indexPath.row].tapSelect)! { 2 //選択中 3 cell.backgroundColor = .lightGray 4} else { 5 //未選択 6 cell.backgroundColor = .clear 7}
ところで

なんで.tapSelectはOptionalなんでしょうか?

投稿2017/10/05 00:27

fuzzball

総合スコア16731

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

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

yamayamak

2017/10/05 02:51

ありがとうございます。なるほど、深いです。。。 頂いた通りに直してもきちんと動作しました。セルを増やす処理はこれからですが、こちらの方が問題がでなさそうですので、こちらをベストアンサーにさせて頂きます。 いろいろありがとうございました。 ちなみに、Optionalは深く考えずに設定しています。Nilチェックなどで、より安全かなー?と思ってそうしましたがあまり意味なさそうですが、意味がないかもあまり理解していませんでした。ちょっと深く検討させて頂きます。
guest

0

cellの取得方法がおかしいと思います。
dequeueReusableCellは未使用のcellを再利用するためのメソッドで普通はtableView(cellForRowAt:)で使います。
今回は現在存在しているcellを取得したいので cellForRow(at:) を使ってみてください。
初回lightGrayになるほうがちょっとよくわかりませんが、、、

投稿2017/10/04 14:35

toki_td

総合スコア2850

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

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

yamayamak

2017/10/04 15:04

完璧でした。 let cell = tableView.cellForRow(at:indexPath) に変更して正常に動作しました。ありがとうございましたm(._.)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問