本文主要是为了记录,我在写一个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;
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,展示数据了。
写在最后:之所以写这篇文章,主要还是为了记录自己的错误,让自己不会再犯同样的错误。要是能帮助到别人,也算一件善事了。