UICollectionCell复用杂谈

2017-06-25  本文已影响0人  _SHIZI

之前一个没怎么用过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中注册即可。

由此由带来了疑问,那么在xib中注册的identifier又有什么作用呢?或者说xib中不注册identifier又有什么副作用呢?
上一篇下一篇

猜你喜欢

热点阅读