我不知道为什么UICollectionView
会如此凌乱,相比之下UITableViewController
……我发现了一些事情。
setSelected:
被多次调用的原因是因为顺序方法被调用。该顺序与方法的顺序非常相似UITextFieldDelegate
。
collectionView:shouldSelectItemAtIndexPath:
在实际选择单元格之前调用该方法collectionView
,因为它实际上是在询问“应该选择它”吗?
collectionView:didSelectItemAtIndexPath:
实际上是在collectionView
选择单元格之后调用的。因此,名称“确实选择了”。
所以这就是你的情况(和我的情况,我不得不为此挣扎几个小时)。
用户再次触摸选定的单元格以取消选择。shouldSelectItemAtIndexPath:
被调用来检查是否应该选择单元格。collectionView
选择单元格然后被didSelectItemAtIndexPath
调用。此时您所做的任何事情都是在单元格的selected
属性设置为之后YES
。这就是为什么类似的东西cell.selected = !cell.selected
不起作用的原因。
TL;DR -通过调用和 returncollectionView
取消选择委托方法中的单元格。collectionView: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;
}
}