我有一个列出一堆视频的集合视图,并点击其中任何一个将推送包含自定义播放器视图的导航控制器来播放视频。点击客户播放器视图上的关闭按钮将弹出当前控制器并返回视频列表控制器。
当敲击其中一个细胞时,细胞会变成灰色。当返回并从视频列表中点击另一个单元格时,我想取消选择之前选择的单元格并使其恢复为白色并使新选择的单元格为灰色。
问题是,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!!!!")
}
答案 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];
}