まず、CollectionViewはTableView同様、最初に読み込まれるときにdelegateメソッドで一気に書かれるのが基本。
セルがタッチされたときに呼ばれる以下のdelegateメソッドに記述することで、特定のセルだけを内容変更することができる。
ただし、この中で直接セルの中の部品をいじってもダメなので、ここでは後述するdelegateメソッドの中で変更するように変更内容を入れる配列(ここではcellIsChecked)などをいじるだけとなる。
//セルが選ばれた時に呼ばれるdelegate
func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
//選ばれたセルのcheckBtnのチェックを反転
if cellIsChecked[indexPath.row] {
cellIsChecked[indexPath.row] = false
} else {
cellIsChecked[indexPath.row] = true
}
//セルの中身を更新したら、Cellを更新しないと反映されない
collectionView.reloadItems(at: [indexPath])
return true
}
セルの中身の変更はあくまでdelegateメソッド内で
collectionView.reloadItems(at: [indexPath])を実行することで、以下のdelegateメソッドが順番に呼ばれる。つまり、あくまでも変更は以下のメソッド中で行うということになる。
ただし、最初に読み込まれる時と違い、下のメソッドはreloadItemsで指定したindexの分だけが呼ばれる。
//セクションの数を指定
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int)
//セルの中身を指定
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath)
{
//選ばれたセルをセル番号で取り出す
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! PhotoCollectionViewCell
var title:String
if cellIsChecked[indexPath.row] { title = "◉" } else { title = "◯" }
cell.checkBtn.setTitle(title , for: .normal)
return cell
}
collectionView.reloadItems(at: [indexPath])
のかわりに
のかわりに
collectionView.reloadData()
で全体を書き換えることもできるが、処理が重いのでオススメはできない。
で全体を書き換えることもできるが、処理が重いのでオススメはできない。
0 件のコメント:
コメントを投稿