在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,展示数据了。

写在最后:之所以写这篇文章,主要还是为了记录自己的错误,让自己不会再犯同样的错误。要是能帮助到别人,也算一件善事了。
UICollectionView,如果你想要实现用户只能选择一个cell,通常你会在数据模型维护一个标识当前选的item的状态,然后在代理方法`collectionView(_:didSelectItemAt:)`进行处理。这里是一个简单的步骤: 1. 定义一个变量来存储选cell或对应的模型索引,例如`var selectedIndexPath: IndexPath? = nil`。 2. 在`collectionView(_:cellForItemAt:)`里,设置每个cell的选择状态。如果cell是当前选的,给它添加高亮样式;如果不是,移除高亮。 ```swift func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellIdentifier", for: indexPath) if indexPath == selectedIndexPath { cell.isSelected = true // 添加选效果 } else { cell.isSelected = false // 移除已选cell的选效果 } return cell } ``` 3. 当`collectionView(_:didSelectItemAt:)`被调用时,更新`selectedIndexPath`并取消其他cell的选状态: ```swift func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { if let oldIndexPath = selectedIndexPath { collectionView.deselectItem(at: oldIndexPath, animated: true) } selectedIndexPath = indexPath collectionView.reloadData() // 刷新视图以显示新的选择 } ``` 4. 如果你想禁用滚动过程的随机点击事件,可以覆盖`collectionView(_:canSelectItemAt:)`方法,返回`false`: ```swift func collectionView(_ collectionView: UICollectionView, canSelectItemAt indexPath: IndexPath) -> Bool { return indexPath == selectedIndexPath } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值