UICollectionView
に比べてなぜこんなに散らかっているのかわかりませんUITableViewController
...いくつか分かったことがあります。
複数回呼び出される理由setSelected:
は、シーケンス メソッドが呼び出されるためです。このシーケンスは、メソッドのシーケンスと非常によく似ていUITextFieldDelegate
ます。
実際に「選択する必要がある」と尋ねているため、実際にセルを選択する前にメソッドcollectionView:shouldSelectItemAtIndexPath:
が呼び出されますか?collectionView
collectionView:didSelectItemAtIndexPath:
実際には、collectionView
がセルを選択した後に呼び出されます。したがって、「選択した」という名前です。
これがあなたのケースで起こっていることです(そして私のケースで、これについて何時間も格闘しなければなりませんでした)。
選択されたセルは、ユーザーが再度タッチして選択を解除します。shouldSelectItemAtIndexPath:
セルを選択する必要があるかどうかを確認するために呼び出されます。はcollectionView
セルを選択してからdidSelectItemAtIndexPath
呼び出されます。この時点で行うことは、セルのselected
プロパティが に設定された後YES
です。そのため、次のようなものは機能しcell.selected = !cell.selected
ません。
TL;DR -collectionView
デリゲート メソッドでセルの選択を解除して、と returncollectionView:shouldSelectItemAtIndexPath:
を呼び出します。deselectItemAtIndexPath:animated:
NO
私がしたことの短い例:
- (BOOL)collectionView:(OPTXListView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath {
NSArray *selectedItemIndexPaths = [collectionView indexPathsForSelectedItems];
if ([selectedItemIndexPaths count]) {
NSIndexPath *selectedIndexPath = selectedItemIndexPaths[0];
if ([selectedIndexPath isEqual:indexPath]) {
[collectionView deselectItemAtIndexPath:indexPath animated:YES];
return NO;
} else {
[collectionView selectItemAtIndexPath:indexPath animated:YES scrollPosition:UICollectionViewScrollPositionCenteredHorizontally];
return YES;
}
} else {
[collectionView selectItemAtIndexPath:indexPath animated:YES scrollPosition:UICollectionViewScrollPositionCenteredHorizontally];
return YES;
}
}