之前一个没怎么用过UICollectionView
这个控件。最近在忙一个App,其中有一个过滤的界面目前看来是用 UICollectionView
好过其他,于是就开始折腾。
先说一下我这边的大致结构,等有时间再补上图片。
过滤的选项有很多维度,一个维度我这边是用一个section。由于是每个维度是单选,所以我给每个section分配了一个HashTable,在
- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;
中,将该section的方法都会存入到对应的HashTable中去。
其中过滤框中有一个折叠功能。我这边的实现方式是设置一个标记位,当标记位被标记时,该section会在dataSource中返回0
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
if (hideSomeDataSource){
return 0;
}
return [dataSource count];
}
当折叠按钮被点击时,将标志位取反,然后调用[collectionView reloadData]
方法。
理想是美好的。最终结果却是方法,每次在按折叠之后,一些过滤选项(UIButton)的selection属性就会错乱。
最终发现应该是点击折叠的时候reload cell复用导致。第一反应是能否让单个section reload。好可惜,当时比较紧,状态比较糟糕。并没有发现
- (void)reloadSections:(NSIndexSet *)sections;
这个方法(被自己蠢哭- -)。
于是曲线救国。想到能不能对不同的section的cell设置为不同的identifier。
由于我的Cell是自己用xib生成的。xib中的identifier并不是一个复选框或者可以填多个identifier。
所以在注册的时候如果注册成了不一致的idenfiter肯定会报错。
于是想了一下,将xib中的identifier去掉会如何。
结果发现真的可以。
所以得出了一个意想不到的结果:当希望一个自定义的Cell被注册为不同的identifier的时候,可以在xib不填identifier,在使用的collectionView中注册即可。