UICollectionView在Swift中未调用DidDeselectItemAtIndexPath方法

时间:2017-08-04 23:55:18

标签: ios swift uicollectionview

我有一个列出一堆视频的集合视图,并点击其中任何一个将推送包含自定义播放器视图的导航控制器来播放视频。点击客户播放器视图上的关闭按钮将弹出当前控制器并返回视频列表控制器。

当敲击其中一个细胞时,细胞会变成灰色。当返回并从视频列表中点击另一个单元格时,我想取消选择之前选择的单元格并使其恢复为白色并使新选择的单元格为灰色。

问题是,didDeselectCellAtIndexPath方法永远不会被调用。之前选择的单元格确实被取消选中,我可以从所选indexPath的打印中看到。但是,委托方法永远不会被调用,因此backgroundColor永远不会变回白色。尽管allowMultipleSesection已经设置为false,但看起来选择了多个单元格。

设置以下配置:

let layout = UICollectionViewFlowLayout()
collectionView?.collectionViewLayout = layout
collectionView?.delegate = self
collectionView?.dataSource = self
collectionView?.allowsSelection = true
collectionView?.allowsMultipleSelection = false

这是我的collectionView方法和委托方法:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell =  collectionView.dequeueReusableCell(withReuseIdentifier: cellID, for: indexPath) as! PreviewCell
    cell.snapShotImageView.image = videoInfoArray[indexPath.item].previewImg
    cell.durationLabel.text = videoInfoArray[indexPath.item].lengthText()
    cell.dateLabel.text = videoInfoArray[indexPath.item].dateAddedText()
    return cell
}


override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let cell = collectionView.cellForItem(at: indexPath) as! PreviewCell
    cell.backgroundColor = UIColor.rgb(red: 240, green: 240, blue: 240)
    let url = URL(fileURLWithPath: videoInfoArray[indexPath.item].path)
    let vc = VideoController()
    self.videoController = vc
    vc.url = url
    self.navigationController?.pushViewController(vc, animated: true)

}

override func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
    let cell = collectionView.cellForItem(at: indexPath) as! PreviewCell

    cell.backgroundColor = UIColor.white
    cell.captionFileLabel.backgroundColor = .white
    print("Deselect called!!! This line should be printed, but it never happens!!!!")
}

This is the video player view controller

After the controller was popped, the list controller shows two cells selected, but only one of them is selected. The DeselectionItemAtIndexPath not called, even though there is ONLY ONE currently selected cell.

6 个答案:

答案 0 :(得分:0)

从文档中我可以理解,当用户选择单元格X时会调用此方法,然后选择单元格Y.现在取消选择单元格X并调用该方法。

在移动到新视图控制器之前保存所选单元格的索引,当您返回到集合视图控制器时,以编程方式取消选择单元格,然后在您自己的函数内运行要在取消选择委托中运行的内容方法

  

当用户尝试取消选择集合视图中的项目时,集合视图会调用此方法。当您以编程方式取消选择项目时,它不会调用此方法。   如果未实现此方法,则默认返回值为true。

答案 1 :(得分:0)

didDeselectItemAt设置为true时,将调用

allowsMultipleSelection

  

backgroundColor永远不会变回白色

即使您之前选择的单元格已取消选中,因为您的视图不会更新。每次返回时都需要更新集合视图单元格视图。您可以在collectionViewController子类的viewWillAppear中刷新完整的UICollectionView。您还可以使用@entire方法取消选择所有选定的indexPath。

答案 2 :(得分:0)

didSelectItemAt方法结束时,请在集合视图上调用deselectItem(at:animated:)方法。

答案 3 :(得分:0)

让单元格处理其背景颜色。 只需将以下内容添加到您的" PreviewCell"类:

override var isSelected: Bool {
    didSet {
        // TODO: replace .red & .blue with desired colors
        backgroundColor = isSelected ? .red : .blue
    }
}

答案 4 :(得分:0)

如果父类没有实现委托方法,那么任何子类都无法做到。

请确保您是Subclassing的Class实现它。

答案 5 :(得分:-1)

didSelectItemAtIndexPath来电:

for (NSIndexPath *indexPath in [self.collectionView indexPathsForSelectedItems]) { [self.collectionView deselectItemAtIndexPath:indexPath animated:NO]; }