コレクションビューを備えた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
}
「選択」モードで各セルの選択を行うと、セルにチェックマークが表示されます。ただし、私がやりたいのは、選択したすべてのセルを無効にし、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
}
}
ここでプログラムがクラッシュして致命的なエラーが発生します:オプションのエラーをラップ解除しているときに予期せずnilが見つかりました
let cell = followCollectionView.cellForItemAtIndexPath(indexP) as! FollowCell
CheckImgのインスタンスを含むFollowCellになるようにセルをアンラップするのに問題がある理由がわかりません。以前、didSelectItemAtIndexPathで同様の状況でそれを使用しましたが、機能しているようです。
おかげで、
選択状態をクリアする時点で、選択したセルのすべてが画面上にあるとは限らないため、collectionView.cellForItemAtIndexPath(indexPath)
はnilを返す場合があります。フォースダウンキャストがあるため、この場合は例外が発生します。
潜在的なnil
条件を処理するようにコードを変更する必要がありますが、indexPathsForSelectedItems
のUICollectionView
プロパティを使用してコードをより効率的にすることもできます
let selectedItems = followCollectionView.indexPathsForSelectedItems
for (indexPath in selectedItems) {
followCollectionView.deselectItemAtIndexPath(indexPath, animated:true)
if let cell = followCollectionView.cellForItemAtIndexPath(indexPath) as? FollowCell {
cell.checkImg.hidden = true
}
}
Swift 4で拡張機能を使用する
extension UICollectionView {
func deselectAllItems(animated: Bool) {
guard let selectedItems = indexPathsForSelectedItems else { return }
for indexPath in selectedItems { deselectItem(at: indexPath, animated: animated) }
}
}
この答えはSwift 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
}
}
さらに単純化するには、次のようにします
followCollectionView.allowsSelection = false
followCollectionView.allowsSelection = true
これは実際には非常に間違っていると感じても、followCollectionView.indexPathsForSelectedItemsを正しくクリアします。