我希望在UICollectionView中所选单元格的数量发生变化时通知KVO。当我尝试子类UICollectionView
并添加新属性nSelectedCells
时,我在尝试添加更新nSelectedCells
的逻辑时遇到了问题。所选细胞计数可能会发生变化的位置太多:
deselectItemAtIndexPath
,selectItemAtIndexPath
,reloadData
,... didDeselectItemAtIndexPath
,didSelectItemAtIndexPath
跟踪此值的最佳方法是什么?最好来自UICollectionView
子类。
答案 0 :(得分:0)
UICollectionViewCell
具有selected
属性。您可以覆盖此方法的setter,因为它是保证在更改单元格的选择状态时唯一可以调用的内容。
或许使用属性对UICollectionView
进行子类化,以保留所选单元格的计数器,并根据是否选择或取消选择单元格,在UICollectionViewCell
中注册setSelected:
子类触发的通知。
请注意,仅仅因为setSelected:
被调用并不意味着选择状态已经改变。
- (void)setSelected:(BOOL)selected {
if (super.selected != selected) {
if (selected) {
// cell was unselected and became selected, increase counter
} else {
// cell was selected and become unselected, decrease counter
}
}
super.selected = selected;
}
答案 1 :(得分:0)
使用NSMutableSet
跟踪选定单元格的索引路径,选择单元格时,添加其indexPath进行设置;取消选择一个单元格,从集合中删除其索引路径。
仅当用户成功选择/取消选择集合视图中的项目时,集合视图才会调用这些方法。以编程方式设置选择/取消选择时,它不会调用该方法。
@property (nonatomic) NSMutableSet *selectedCellIndexPathsSet;
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
//do some things.
[self.selectedCellIndexPathsSet addObject:indexPath];
}
- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath
{
//do some thing.
[self.selectedCellIndexPathsSet removeObject:indexPath];
}