35

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

つまり、外観にもかかわらず、プログラムでセルの選択を解除すると、collectionviewは現在の選択リストを更新しません。

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

カスタムセルの場合:

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

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

見てくれてありがとうTBlue

4

9 に答える 9

86

あなたは繰り返すことができます- [UICollectionView indexPathsForSelectedItems]

for (NSIndexPath *indexPath in [self.collectionView indexPathsForSelectedItems]) {
    [self.collectionView deselectItemAtIndexPath:indexPath animated:NO];
}
于 2013-12-03T01:45:17.057 に答える
22

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

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

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

于 2016-01-04T08:46:22.890 に答える
11

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];
}

編集:@BenLingsと@JeremyWiebeのコメントに完全に同意します。@qorkfiendのソリューションがこれよりも優先されます。

于 2013-01-22T13:41:59.873 に答える
4

これがSwiftの単純な解決策である場合に備えて:

extension UICollectionView {
    func deselectAllItems(animated animated: Bool = false) {
        for indexPath in self.indexPathsForSelectedItems() ?? [] {
            self.deselectItemAtIndexPath(indexPath, animated: animated)
        }
    }
}
于 2015-11-24T03:11:49.337 に答える
2

swift 3の場合、拡張機能は次のようになります。

import UIKit

extension UICollectionView {
    func deselectAllItems(animated: Bool = false) {
        for indexPath in self.indexPathsForSelectedItems ?? [] {
            self.deselectItem(at: indexPath, animated: animated)
        }
    }
}
于 2017-03-17T17:20:34.493 に答える
1

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

for (NSIndexPath *indexPath in [self.cuisineCollection indexPathsForSelectedItems]) {
            [self.collectionView deselectItemAtIndexPath:indexPath animated:NO];
            [collectionView.delegate collectionView:cuisineCollection didDeselectItemAtIndexPath:indexPath];
        }
于 2018-11-16T12:58:29.713 に答える
0

私は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
    }


}
于 2016-08-06T20:20:37.243 に答える
0

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

簡単に次のように呼び出すことができます。

collectionView.allowsSelection = false
collectionView.allowsSelection = true
于 2018-02-05T07:12:07.437 に答える
0

これは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)
}
于 2018-04-20T07:21:48.670 に答える