web-dev-qa-db-ja.com

allowMultipleSelectionが有効になっている場合、UICollectionViewでプログラムによってセルの選択が解除される方法

コレクションビューでallowMultipleSelectionを有効にしました。タップすると、セルは選択した状態との間で変化します。すべて良い。ただし、以下のコードを使用してビュー全体を選択状態にリセットしたい場合:NO、新しい選択を行うまでセルは完全に選択解除されているように見えます。その時点で、以前に選択されたすべてのセルは以前に選択された状態を示します。

つまり、外観にもかかわらず、プログラムでセルの選択を解除すると、コレクションビューは現在の選択リストを更新しません

- (void)clearCellSelections {
   for (LetterCell  *cell in self.collectionView.visibleCells) {
        [cell prepareForReuse];
    }
}

カスタムセル内:

- (void)prepareForReuse
{
    [super prepareForReuse];
    [self setSelected:NO];
}

私は何を間違えていますか?すべてのセルを選択解除する別の方法はありますか?

見てくれてありがとうTBlue

34
Steve

- [UICollectionView indexPathsForSelectedItems]を反復処理できます:

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

UICollectionViewで選択されているすべてのセルを選択解除する最も簡単な方法は、collectionView.selectItem(at:, animated:, scrollPosition:)への最初の引数としてnilを渡すことです。例えば。、

collectionView.selectItem(at: nil, animated: true, scrollPosition: [])

allowsMultipleSelection == trueであっても、現在の選択状態をクリアします。

19
taherh

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のソリューションはこのソリューションよりも優先されます。

11
fguchelaar

念のため、これはSwiftのシンプルなソリューションです:

extension UICollectionView {
    func deselectAllItems(animated animated: Bool = false) {
        for indexPath in self.indexPathsForSelectedItems() ?? [] {
            self.deselectItemAtIndexPath(indexPath, animated: animated)
        }
    }
}
4

Swift 3拡張機能は次のようになります。

import UIKit

extension UICollectionView {
    func deselectAllItems(animated: Bool = false) {
        for indexPath in self.indexPathsForSelectedItems ?? [] {
            self.deselectItem(at: indexPath, animated: animated)
        }
    }
}
2
KIO

これも委任したい場合は完了です

for (NSIndexPath *indexPath in [self.cuisineCollection indexPathsForSelectedItems]) {
            [self.collectionView deselectItemAtIndexPath:indexPath animated:NO];
            [collectionView.delegate collectionView:cuisineCollection didDeselectItemAtIndexPath:indexPath];
        }
1
Varun Naharia

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
    }


}
0
retrovius

これは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)
}
0
Lance Samaria

この答えが必ずしも「最高」であるというわけではありませんが、誰も言及していないので追加します。

単に次を呼び出すことができます。

collectionView.allowsSelection = false
collectionView.allowsSelection = true
0
cnotethegr8