在collectionView中返回两个不同的cell

本文主要是为了记录,我在写一个demo时,在collectionView中返回两个不同cell时出现的一个问题。以此给想要实现返回不同cell的朋友们一个思路。当然,知道如何实现的大神,也可以给我提供一下更好的思路。
一:功能展示
那么我们先上效果图,让大家知道主要为了实现什么功能:


二:功能介绍
点击“添加”,跳转控制器,输入文本,点击“确定”按钮,返回控制器,并且在添加按钮上面添加一个展示刚才输入信息的cell。

三:功能分析
1、“添加”本身就是一个自定义cell,我命名为“addCell”(名字有点俗气,但是简洁明了。)
2、点击“添加”,跳转控制器,所以是在代理方法中实现
3、点击“确认”按钮,返回上一个控制器,并添加一个新的cell展示之前输入的信息(新的cell也是一个自定义cell,我命名为“ProgressCell”)
4、“添加”始终处在最后一个

四:思路提示
1、collectionView能够展示数据,必须要有数据源,所以我首先定义一个数据源数组
///数据源
@property (nonatomic,strong)NSMutableArray<EventModel *> *eventArray;
2、不管数据源中存不存在数据,“添加”cell 都要存在,所以在以下方法中实现
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {   
   
returnself.eventArray.count + 1;
}
,这样即使数据源中不存在模型数据,都能返回一个cell
3、当跳转的控制器dismiss的时候,我是通过block实现值回传,数据源添加模型数据,并且刷新数据源。然后在
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;
方法中判断 indexPath.item 与 self.eventArray.count的值来判断返回怎么样的cell

五:错误代码的掩饰

这里说一下,我当时的想法:
因为最后一个cell总是“添加”,但是最开始在“numberOfItemsInSection”方法中返回了 returnself.eventArray.count + 1;
所以当 indexPath.item == self.eventArray.count + 1 的时候 返回“添加”cell,那么当 indexPath.item <=self.eventArray.count 的时候,会返回展示数据的cell。貌似思路没错,但是展示的效果却如下:不管怎么样,都只显示展示数据的cell,“添加”cell不见了。下面,我会展示正确的代码,进行解释

六:正确代码的掩饰

那么上面错误代码的错误原因在哪里呢?
错误原因:indexPath.item是cell的下标,下标是从0开始的。当数据源没有数据的时候,数据源数组的count为0,但是会有一个cell显示,而这个cell的下标也为0,满足indexPath.item <=self.eventArray.count,所以才会展示错误的效果,当数据源有数据的时候,cell也是从下标为0的开始返回,所以每次indexPath.item <=self.eventArray.count 条件都满足,所以才会一直显示展示数据的cell。
解决办法:修改if条件:indexPath.item !=self.eventArray.count
解释下:当数据源为空的时候:self.eventArray.count =0;但是有一个cell下标为0.两者相等,所以返回“添加”cell。
       当数据源为1的时候:self.eventArray.count =1;有两个cell,cell从下标为0开始返回。当cell下标为0时,indexPath.item !=self.eventArray.count,返回展示数据的cell。当返回下标为1的cell时,indexPath.item !=self.eventArray.count 不成立,返回“添加”cell。以此类推。
这样便能够实现我们预期的返回不同的cell,“添加”cell一直在最后一个。下面要做的就是让展示cell,展示数据了。

写在最后:之所以写这篇文章,主要还是为了记录自己的错误,让自己不会再犯同样的错误。要是能帮助到别人,也算一件善事了。
展开阅读全文

没有更多推荐了,返回首页