35

我在集合视图中启用了 allowMultipleSelection。点击时,单元格会在其选定状态之间切换。都好。但是,当我想使用下面的代码将整个视图重置为选定状态:否时,单元格似乎被完全取消选择,直到我做出新的选择,此时所有先前选择的单元格都显示其先前选择的状态。

即,尽管出现,当我以编程方式取消选择单元格时,collectionview 并未更新其当前选择列表

- (void)clearCellSelections {
   for (LetterCell  *cell in self.collectionView.visibleCells) {
        [cell prepareForReuse];
    }
}

在自定义单元格中:

- (void)prepareForReuse
{
    [super prepareForReuse];
    [self setSelected:NO];
}

我究竟做错了什么?还有其他方法可以取消选择所有单元格吗?

感谢 TBlue 看一看

4

9 回答 9

86

您可以迭代- [UICollectionView indexPathsForSelectedItems]

for (NSIndexPath *indexPath in [self.collectionView indexPathsForSelectedItems]) {
    [self.collectionView deselectItemAtIndexPath:indexPath animated:NO];
}
于 2013-12-03T01:45:17.057 回答
22

取消选择 a 中所有选定单元格的最简单方法UICollectionView是将nil其作为第一个参数传递给collectionView.selectItem(at:, animated:, scrollPosition:)。例如,

collectionView.selectItem(at: nil, animated: true, scrollPosition: [])

将清除当前选择状态,即使allowsMultipleSelection == true.

于 2016-01-04T08:46:22.890 回答
11

您可以说UITableViewCell.selected只设置单元格的“可见状态/外观”及其内容。您可以通过遍历 tableView 的所有 indexPaths 并调用deselectRowAtIndexPath:animated:每个单元格来取消选择单元格。

例如:

for (int i=0; i < self.myData.count; i++) {
    [self.tableView deselectRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0] animated:YES];
}

编辑:我完全同意@BenLings 和@JeremyWiebe 的评论,@qorkfiend 的解决方案比这个更受欢迎。

于 2013-01-22T13:41:59.873 回答
4

以防万一这是 Swift 中的简单解决方案:

extension UICollectionView {
    func deselectAllItems(animated animated: Bool = false) {
        for indexPath in self.indexPathsForSelectedItems() ?? [] {
            self.deselectItemAtIndexPath(indexPath, animated: animated)
        }
    }
}
于 2015-11-24T03:11:49.337 回答
2

对于 swift 3 扩展,看起来像这样:

import UIKit

extension UICollectionView {
    func deselectAllItems(animated: Bool = false) {
        for indexPath in self.indexPathsForSelectedItems ?? [] {
            self.deselectItem(at: indexPath, animated: animated)
        }
    }
}
于 2017-03-17T17:20:34.493 回答
1

如果您要委托也可以调用这是完整的

for (NSIndexPath *indexPath in [self.cuisineCollection indexPathsForSelectedItems]) {
            [self.collectionView deselectItemAtIndexPath:indexPath animated:NO];
            [collectionView.delegate collectionView:cuisineCollection didDeselectItemAtIndexPath:indexPath];
        }
于 2018-11-16T12:58:29.713 回答
0

并不是说这个答案一定是“最好的”,但由于没有人提到它,我会添加它。

您可以简单地调用以下内容。

collectionView.allowsSelection = false
collectionView.allowsSelection = true
于 2018-02-05T07:12:07.437 回答
0

这是 Swift 中的@qorkfiend 答案

// this is an array of the selected item(s) indexPaths
guard let indexPaths = collectionView.indexPathsForSelectedItems else { return }

// loop through the array and individually deselect each item
for indexPath in indexPaths{
    collectionView.deselectItem(at: indexPath, animated: true)
}
于 2018-04-20T07:21:48.670 回答
0

我创建了一个名为 toggleCellSelection 的全局变量,然后在 didSelectItemAt 函数中运行它:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    print("select cell \(indexPath.row)")

    let cell = collectionView.cellForItem(at: indexPath)
    if (toggleCellSelection == true) {
        toggleCellSelection = false
        cell?.layer.borderWidth = 0
        cell?.layer.borderColor = UIColor.clear().cgColor
    } else {
        toggleCellSelection = true
        cell?.layer.borderWidth = 5
        cell?.layer.borderColor = #colorLiteral(red: 0.8779790998, green: 0.3812967837, blue: 0.5770481825, alpha: 1).cgColor
    }


}
于 2016-08-06T20:20:37.243 回答