2017年7月13日木曜日

CollectionViewのCellの中身を更新

CollectionViewのセルをタッチしたら画像を変更するとか、タッチしたセルだけ選択された印のチェックマークをつけたりする方法。

まず、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 件のコメント:

コメントを投稿