我有一个带集合视图的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
}
}
程序崩溃在这里给我一个致命的错误:在
打开一个可选错误时意外地发现了nillet cell = followCollectionView.cellForItemAtIndexPath(indexP) as! FollowCell
我不知道为什么在将单元格解包为包含checkImg实例的FollowCell时遇到问题。我之前在didSelectItemAtIndexPath的类似情况中已经使用过它,它似乎有效吗?
谢谢,
答案 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) }