为啥在 cellForItemAt 中将 isSelected 设置为 true 的单元格的 UICollectionView 未将 isSelected 设置为 false? [复制]

Posted

技术标签:

【中文标题】为啥在 cellForItemAt 中将 isSelected 设置为 true 的单元格的 UICollectionView 未将 isSelected 设置为 false? [复制]【英文标题】:Why does a UICollectionView not set isSelected to false for a cell that has isSelected set to true in cellForItemAt? [duplicate]为什么在 cellForItemAt 中将 isSelected 设置为 true 的单元格的 UICollectionView 未将 isSelected 设置为 false? [复制] 【发布时间】:2017-03-26 04:56:48 【问题描述】:

我正在使用具有默认选择规则的UICollectionView(仅限单选)。在我的自定义 UICollectionViewCell 类中,我已经像这样覆盖了 isSelected

override var isSelected: Bool 
    didSet 
        self.backgroundColor = isSelected ? UIColor.gray : UIColor.white
    

我还在视图控制器的collection​View(_:​cell​For​Item​At:​) 中为一个特定单元格设置了isSelected,因为出于某种原因,集合的selectItem() 方法在cellForItemAt 中不起作用。

这使我能够确保在包含集合的整个视图实际出现之前选择了这个单元格并更改了其背景,但这产生了一个奇怪的问题。

当我开始点击其他集合单元格并选择它们时,我从一开始就设置为选中的那个单元格的背景颜色没有设置为白色。

但是,当我通过点击它们依次选择不同的单元格时,它们的背景颜色会按预期切换为白色,而我在集合的初始填充期间设置isSelected 的那个单元格始终保持灰色除非我专门点击它,然后在不同的单元格中点击它。

谁能帮我弄清楚这是为什么?为什么当我点击一个单元格而不是我在cellForItemAt 中设置的isSelected 属性的单元格时,isSelected 没有设置为false

编辑:我尝试实现collection​View:​did​Deselect​Item​At​Index​Path:​,但它根本不会触发。因此,一方面,isSelected 属性肯定已设置,因为该单元格的背景变为灰色,但另一方面,该集合似乎并未将该单元格视为已选中 .

【问题讨论】:

提供你的- collection​View(_:​cell​For​Item​At:​)方法的代码。 只是单元格的标准出列并根据绝对不干扰此的条件设置cell.isSelected = true。问题是,由于某种原因,点击并因此选择其他单元格不会将初始单元格的isSelected 设置为false,但会为所有随后取消选择的单元格设置。 您为什么将cell.isSelected 明确设置为true?这是默认实现的工作。你能在你的代码中测试评论cell.isSelected = true吗? 正如我在原始帖子中提到的那样,我设置了属性,因为出于某种我不知道的原因,collectionView.selectItem() 方法在cellForItemAt 中不起作用。所以也许这里有一个我没有看到的更大规模的错误,与最初填充后集合的作用有关? 也许吧。但为此,我必须看看你的实现。最好看看我下面的答案以了解不同的解决方法。我希望这会有所帮助。 【参考方案1】:

当您编辑了您的问题时,您可以使用这种方法。

// change background color when user touches cell
func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) 
    let cell = collectionView.cellForItem(at: indexPath)
    cell?.backgroundColor = UIColor.gray


// change background color back when user releases touch
func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath) 
    let cell = collectionView.cellForItem(at: indexPath)
    cell?.backgroundColor = UIColor.white

【讨论】:

以上是关于为啥在 cellForItemAt 中将 isSelected 设置为 true 的单元格的 UICollectionView 未将 isSelected 设置为 false? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

cellForItemAt 在 Swift collectionView 中只调用一次

reloadData 没有调用 cellForItemAt

从未在类中调用 cellForItemAt 扩展 UICollectionViewController

UICollectionView CellForItemAt 在滚动时被多次调用,导致单元格文本重叠

Swift DRY collectionView(_ cellForItemAt) 调用

UICollectionView 中 cellForItemAt 的滚动单元格问题