web-dev-qa-db-ja.com

UICollectionViewすべての選択を解除する方法

コレクションビューを備えたFollowVCおよびFollowCellセットアップがあります。問題なく次のコードを使用して、すべてのデータをuIcollectionビューセルに正しく表示できます。

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    if let cell = collectionView.dequeueReusableCellWithReuseIdentifier("FollowCell", forIndexPath: indexPath) as? FollowCell {

        let post = posts[indexPath.row]

        cell.configureCell(post, img: img)

        if cell.selected == true {
            cell.checkImg.hidden = false
        } else {
            cell.checkImg.hidden = true
        }
        return cell
    }
}

次のコードを使用して、複数の画像を選択および選択解除することもできます。

    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {

    if deletePressed == true {
        let cell = collectionView.cellForItemAtIndexPath(indexPath) as! FollowCell
        cell.checkImg.hidden = false
    } else {
        let post = posts[indexPath.row]
        performSegueWithIdentifier(SEGUE_FOLLOW_TO_COMMENTVC, sender: post)
    }
}

func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) {
    let cell = collectionView.cellForItemAtIndexPath(indexPath) as! FollowCell
    cell.checkImg.hidden = true
}

「選択」モードで各セルの選択を行うと、セルにチェックマークが表示されます。ただし、私がやりたいのは、選択したすべてのセルを無効にし、checkImgを削除するキャンセルボタンを使用することです。

私が試してみました

    func clearSelection() {
    print("ClearSelection posts.count = \(posts.count)")

    for item in 0...posts.count - 1 {
        let indexP = NSIndexPath(forItem: item, inSection: 0)
        followCollectionView.deselectItemAtIndexPath(indexP, animated: true)
        let cell = followCollectionView.cellForItemAtIndexPath(indexP) as! FollowCell
        cell.checkImg.hidden = true
    }
}

ここでプログラムがクラッシュして致命的なエラーが発生します:オプションのエラーをラップ解除しているときに予期せずnilが見つかりました

let cell = followCollectionView.cellForItemAtIndexPath(indexP) as! FollowCell

CheckImgのインスタンスを含むFollowCellになるようにセルをアンラップするのに問題がある理由がわかりません。以前、didSelectItemAtIndexPathで同様の状況でそれを使用しましたが、機能しているようです。

おかげで、

15
user172902

選択状態をクリアする時点で、選択したセルのすべてが画面上にあるとは限らないため、collectionView.cellForItemAtIndexPath(indexPath)はnilを返す場合があります。フォースダウンキャストがあるため、この場合は例外が発生します。

潜在的なnil条件を処理するようにコードを変更する必要がありますが、indexPathsForSelectedItemsUICollectionViewプロパティを使用してコードをより効率的にすることもできます

 let selectedItems = followCollectionView.indexPathsForSelectedItems
 for (indexPath in selectedItems) {
     followCollectionView.deselectItemAtIndexPath(indexPath, animated:true)
     if let cell = followCollectionView.cellForItemAtIndexPath(indexPath) as? FollowCell {
        cell.checkImg.hidden = true
     }
 }
23
Paulw11

Swift 4で拡張機能を使用する

extension UICollectionView {

    func deselectAllItems(animated: Bool) {
        guard let selectedItems = indexPathsForSelectedItems else { return }
        for indexPath in selectedItems { deselectItem(at: indexPath, animated: animated) }
    }
}
6
Sangwon Park

この答えはSwift 4.2

 let selectedItems = followCollectionView.indexPathsForSelectedItems

 for (value in selectedItems) {
     followCollectionView.deselectItemAtIndexPath(value, animated:true)
     if let cell = followCollectionView.cellForItemAtIndexPath(value) as? FollowCell {
        cell.checkImg.hidden = true
     }
 }
0
Ankur Purwar

さらに単純化するには、次のようにします

followCollectionView.allowsSelection = false
followCollectionView.allowsSelection = true

これは実際には非常に間違っていると感じても、followCollectionView.indexPathsForSelectedItemsを正しくクリアします。

0