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

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

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

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

Swift

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

Q&A

解決済

2回答

3981閲覧

CollectionViewでの選択されていないセルについて

rookie

総合スコア26

Xcode

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

Swift

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

0グッド

1クリップ

投稿2016/11/21 06:58

編集2016/11/21 07:06

現在もSwiftを勉強しているものです。

早速ですが表題の件について質問があります。

CollectionViewを使用して、
セルを選択した場合に色を変えるという事を勉強していました。

こちらは分かったのですが、
逆に選択されていないセルの色を変更など出来ないものかと考えております。

どうしても方法を思いつきませんでしたので、
こちらに投稿させて頂きました。

こちらのサイト様を参考に勉強して
タップしたら色を変えるだけを実装しております。

Docs様 CollectionViewの実装

Swift

1// ViewController 2 3import UIKit 4 5class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource { 6 7 var myCollectionView : UICollectionView! 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 // CollectionViewのレイアウトを生成. 13 let layout = UICollectionViewFlowLayout() 14 15 16 // Cell一つ一つの大きさ. 17 layout.itemSize = CGSize(width:50, height:50) 18 19 // Cellのマージン. 20 layout.sectionInset = UIEdgeInsetsMake(16, 16, 32, 16) 21 22 // セクション毎のヘッダーサイズ. 23 layout.headerReferenceSize = CGSize(width:100,height:30) 24 25 // CollectionViewを生成. 26 myCollectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout) 27 28 // Cellに使われるクラスを登録. 29 myCollectionView.register(CustomUICollectionViewCell.self, forCellWithReuseIdentifier: "MyCell") 30 31 myCollectionView.delegate = self 32 myCollectionView.dataSource = self 33 34 self.view.addSubview(myCollectionView) 35 36 } 37 38 /* 39 Cellが選択された際に呼び出される 40 */ 41 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 42 43 print("Num: \(indexPath.row)") 44 45 let cell = collectionView.cellForItem(at: indexPath) as! CustomUICollectionViewCell 46 // 選択されたセルを赤にする 47 cell.imageView.backgroundColor = .red 48 } 49 50 /* 51 Cellの総数を返す 52 */ 53 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 54 return 8 55 } 56 57 /* 58 Cellに値を設定する 59 */ 60 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 61 62 let cell : CustomUICollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCell", for: indexPath) as! CustomUICollectionViewCell 63 64 return cell 65 } 66 67}

Swift

1// CustomCell 2 3import UIKit 4 5class CustomUICollectionViewCell : UICollectionViewCell{ 6 7 var imageView: UIImageView! 8 9 required init(coder aDecoder: NSCoder) { 10 super.init(coder: aDecoder)! 11 } 12 13 override init(frame: CGRect) { 14 super.init(frame: frame) 15 16 // UILabelを生成. 17 imageView = UIImageView(frame: CGRect(x:0, y:0, width:frame.width, height:frame.height)) 18 imageView.backgroundColor = UIColor.white 19 20 // Cellに追加. 21 self.contentView.addSubview(imageView) 22 } 23 24}

実装したい内容を詳しく説明すると、
セル0をタップして赤に変更する
→セル1をタップしてセル1を赤に変更、セル0を白に戻す
→セル2をタップしてセル2を赤に変更、セル1を白に戻す
→・・・・

というように常に1つのセルの色だけを変更したいです。

どうかご教授お願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

今の実装だと、選択してセルを赤くした後にスクロールさせると、別のセルが赤くなりませんか?
まずはそこから修正しないといけません。(というか、そこを修正すれば質問は解決します)

選択したセルに直接アクセスするのではなく、生成するときに色を変更するようにします。

1. 選択したセル番号を保存する変数を追加する。

型はIndexPathか、セクション未使用ならIndexPath.rowだけOKです。

2. cellForItemAtの中

セルを生成した後で、選択中のセルであれば背景を赤く、そうでなければ白くします。

3. didSelectItemAtの中

選択したセル番号を保存し、tableView.reloadData()でテーブルを更新します。
更新することで、「セルが再生成される = cellForItemAtが呼ばれる」ので、新たに選択したセルの背景は赤く、それ以外のセルは白くなります。

投稿2016/11/21 08:05

fuzzball

総合スコア16731

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

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

rookie

2016/11/22 01:51

確かにスクロールすると赤に変わったセルの場所が移動してしまいました。 1. 選択したセル番号を保存する変数を追加する。 var myIndexPath: IndexPath! // 宣言 2. cellForItemAtの中 if indexArray != nil { if indexArray == indexPath { cell.imageView.backgroundColor = .red } } 3. didSelectItemAtの中 myIndexPath = indexPath collectionView.reloadData() を追記しましたが、 タップしていくたびにタップした場所と違う場所まで赤になってしまいます。 まだ不足している部分があると思うのですが、 残念ながら思い付きません。 もう一度ご教授頂けないでしょうか。 よろしくお願いします。
fuzzball

2016/11/22 01:57

「選択しているセルを赤」にするだけではなく、「選択していないセルを白」にしないといけません。そうしないと、一度赤くなったセルは永遠に赤いままです。(セルは使い回されるということを忘れずに)
rookie

2016/11/22 02:21

ご返答ありがとうございます。 なるほど! 適切なアドバイスありがとうございました!! 他にしたい処理に関してもこちらで応用出来そうです。 本当にありがとうございました。 また質問する事があると思いますので、 その時は是非よろしくお願い致します。
guest

0

非選択時のデリゲートを実装すればできますよ

swift

1 func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) { 2 let cell = collectionView.cellForItem(at: indexPath) as! CustomUICollectionViewCell 3 cell.imageView.backgroundColor = .white 4 } 5

投稿2016/11/21 08:03

fromageblanc

総合スコア2724

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

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

rookie

2016/11/22 02:24

ご回答ありがとうございます。 確かにこちらで選択したセルは赤、 他は白になりました。 ただ他の処理等の応用を考えて、 申し訳ありませんが今回はfuzzball様のご回答をベントアンサーとさせて頂きます。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問