在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 {   
   
return self.eventArray.count + 1;
}
,这样即使数据源中不存在模型数据,都能返回一个cell
3、当跳转的控制器dismiss的时候,我是通过block实现值回传,数据源添加模型数据,并且刷新数据源。然后在
- ( UICollectionViewCell *)collectionView:( UICollectionView *)collectionView cellForItemAtIndexPath:( NSIndexPath *)indexPath;
方法中判断  indexPath. item 与  self . eventArray . count 的值来判断返回怎么样的cell

五:错误代码的掩饰

这里说一下,我当时的想法:
因为最后一个cell总是“添加”,但是最开始在“ numberOfItemsInSection”方法中返回了  return self . 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,展示数据了。

写在最后:之所以写这篇文章,主要还是为了记录自己的错误,让自己不会再犯同样的错误。要是能帮助到别人,也算一件善事了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值