コレクションビューでallowMultipleSelectionを有効にしました。タップすると、セルは選択した状態との間で変化します。すべて良い。ただし、以下のコードを使用してビュー全体を選択状態にリセットしたい場合:NO、新しい選択を行うまでセルは完全に選択解除されているように見えます。その時点で、以前に選択されたすべてのセルは以前に選択された状態を示します。
つまり、外観にもかかわらず、プログラムでセルの選択を解除すると、コレクションビューは現在の選択リストを更新しません
- (void)clearCellSelections {
for (LetterCell *cell in self.collectionView.visibleCells) {
[cell prepareForReuse];
}
}
カスタムセル内:
- (void)prepareForReuse
{
[super prepareForReuse];
[self setSelected:NO];
}
私は何を間違えていますか?すべてのセルを選択解除する別の方法はありますか?
見てくれてありがとうTBlue
- [UICollectionView indexPathsForSelectedItems]
を反復処理できます:
for (NSIndexPath *indexPath in [self.collectionView indexPathsForSelectedItems]) {
[self.collectionView deselectItemAtIndexPath:indexPath animated:NO];
}
UICollectionView
で選択されているすべてのセルを選択解除する最も簡単な方法は、collectionView.selectItem(at:, animated:, scrollPosition:)
への最初の引数としてnil
を渡すことです。例えば。、
collectionView.selectItem(at: nil, animated: true, scrollPosition: [])
allowsMultipleSelection == true
であっても、現在の選択状態をクリアします。
UITableViewCell.selected
は、セルとそのコンテンツの「表示状態/外観」のみを設定すると言うことができます。 tableViewのすべてのindexPathを反復処理し、それぞれに対してdeselectRowAtIndexPath:animated:
を呼び出すことにより、セルの選択を解除できます。
例えば:
for (int i=0; i < self.myData.count; i++) {
[self.tableView deselectRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0] animated:YES];
}
[〜#〜] edit [〜#〜]:@BorLingsと@JeremyWiebeのコメントに完全に同意します。@ qorkfiendのソリューションはこのソリューションよりも優先されます。
念のため、これはSwiftのシンプルなソリューションです:
extension UICollectionView {
func deselectAllItems(animated animated: Bool = false) {
for indexPath in self.indexPathsForSelectedItems() ?? [] {
self.deselectItemAtIndexPath(indexPath, animated: animated)
}
}
}
Swift 3拡張機能は次のようになります。
import UIKit
extension UICollectionView {
func deselectAllItems(animated: Bool = false) {
for indexPath in self.indexPathsForSelectedItems ?? [] {
self.deselectItem(at: indexPath, animated: animated)
}
}
}
これも委任したい場合は完了です
for (NSIndexPath *indexPath in [self.cuisineCollection indexPathsForSelectedItems]) {
[self.collectionView deselectItemAtIndexPath:indexPath animated:NO];
[collectionView.delegate collectionView:cuisineCollection didDeselectItemAtIndexPath:indexPath];
}
ToggleCellSelectionというグローバル変数を作成し、didSelectItemAt関数でこれを実行しました。
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
print("select cell \(indexPath.row)")
let cell = collectionView.cellForItem(at: indexPath)
if (toggleCellSelection == true) {
toggleCellSelection = false
cell?.layer.borderWidth = 0
cell?.layer.borderColor = UIColor.clear().cgColor
} else {
toggleCellSelection = true
cell?.layer.borderWidth = 5
cell?.layer.borderColor = #colorLiteral(red: 0.8779790998, green: 0.3812967837, blue: 0.5770481825, alpha: 1).cgColor
}
}
これはSwiftの@qorkfiendの回答です
// this is an array of the selected item(s) indexPaths
guard let indexPaths = collectionView.indexPathsForSelectedItems else { return }
// loop through the array and individually deselect each item
for indexPath in indexPaths{
collectionView.deselectItem(at: indexPath, animated: true)
}
この答えが必ずしも「最高」であるというわけではありませんが、誰も言及していないので追加します。
単に次を呼び出すことができます。
collectionView.allowsSelection = false
collectionView.allowsSelection = true