collectionView的复用无疑是一个很牛X的机制,然而,在实际项目中,我们也常常会被这一机制所困扰!近段时间在我的项目中就遇到了两种复用引起的问题(问题已经解决,我就不复现之前的问题了):
1,复用引起的视图重叠问题
我当时的问题是:我在单元格上加了一个视图View1,这个View1是动态的,然而每次滑动的时候都会出现重叠的问题!
我的解决方案是:在setModel里面,当给View1填充内容之前,我先将View1给removeAllSubviews.这样就得到了解决.
2,多组单元格的多选引起的复用问题
问题描述:我需要选择筛选条件,而且是多个筛选类型,因此,这里就需要用到多组,并且点击之后单元格的样式(颜色,文字啥的)要改变,因此就要记录它的选中状态,而当我选择了第一组的的第A个的时候,往下滑动,重新出现的那几组的第A个都会被选中.这样就很尴尬了,我只是想改变那一组啊!我原本用的方式是cell.hasSelected = self.selectedIndex == indexPath.row;点击单元格的时候改变self.selectedIndex,然后刷新点击的那一组,以为这样就可以了?然而复用机制导致的问题依然会出现!!!
解决方案:来一个可变数组,装上你点击的那一组的单元格的indexPath.row,当然会有一个初始值:
[self.selectedArray addObjectsFromArray:@[@"0",@"0",@"0",@"0",@"0",@"0",@"0",@"0"]];
我这里有8个组,因此我存进去的是8个元素,里面的对象就是每一组的选中的那一个,如上的初始,当然是默认每一组选中第一个,这样,在单元格的创建里我是这样做的:
NSString *selectedValue = [self.selectedArray objectAtIndex:indexPath.section];
cell.hasSelected = [selectedValue integerValue] == indexPath.row;
用indexPath.section取到选中的那个元素,然后跟indexPath.row对比,给单元格是否选中赋值(因为你每一组里面应该不会是只有一个单元格的).
那么在点击单元格的事件里面我是这样做的:
[self.selectedArray replaceObjectAtIndex:indexPath.section withObject:[NSString stringWithFormat:@"%ld",indexPath.row]];
[self.collectionView reloadData];
我直接将数组里面你选中的那一组的选中的那一个给替换掉!这样我也不需要单独去更新某一组了,全部去刷新吧!
[当然,以上问题只是我个人在项目中遇到的,不同的情况也会有不同的解决方案,仅供参考,希望对大家有用,同事如果有什么问题也可以发出来大家一起探讨探讨]