UICollectionView如何取消选择所有

时间:2016-07-18 07:17:48

标签: ios objective-c swift uicollectionview uicollectionviewcell

我有一个带集合视图的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
}

当In"选择"模式,我可以执行每个单元格的选择,并在单元格上显示复选标记。但是,我想要做的是取消按钮以禁用所有选定的单元格并删除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的类似情况中已经使用过它,它似乎有效吗?

谢谢,

6 个答案:

答案 0 :(得分:19)

当您清除选择状态时,并非所有选定的单元格都在屏幕上,因此if (RButtonstate == LOW) {可能会返回nil。由于你有一个力量向下倾斜,在这种情况下你会得到一个例外。

您需要修改代码以处理潜在的collectionView.cellForItemAtIndexPath(indexPath)条件,但您也可以使用nil的{​​{1}}属性

来提高代码效率
indexPathsForSelectedItems

答案 1 :(得分:4)

在Swift 4中使用扩展程序

extension UICollectionView {

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

答案 2 :(得分:0)

为进一步简化,您可以这样做

followCollectionView.allowsSelection = false
followCollectionView.allowsSelection = true

这实际上会正确清除您的followCollectionView.indexPathsForSelectedItems,即使感觉非常错误。

答案 3 :(得分:0)

此答案在快速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
     }
 }

答案 4 :(得分:0)

我这样做可以更轻松地解决它:

 tableView.selectRow(at: nil, animated: true, scrollPosition: UITableView.ScrollPosition.top)

答案 5 :(得分:0)

collectionView.indexPathsForSelectedItems?
    .forEach { collectionView.deselectItem(at: $0, animated: false) }