iOS - 如何在将单元格动态插入 UICollectionView 之前正确重新加载单元格
Posted
技术标签:
【中文标题】iOS - 如何在将单元格动态插入 UICollectionView 之前正确重新加载单元格【英文标题】:iOS - How to properly reload a cell before inserting it dynamically in UICollectionView 【发布时间】:2018-02-09 09:03:52 【问题描述】:在我的datasource
中动态插入对象时,我遇到了一种可以理解的行为。
这是我的代码:
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:1 inSection:0];
[_dataSource insertObject:newObject atIndex:indexPath.row];
[_collectionView insertItemsAtIndexPaths:@[indexPath]];
我在这里做的是在我的datasource
中插入一个对象(因为这个对象在启动时还没有准备好,我通过delegate
方法接收它)。
然后,我想在这个特定的 indexPath 处触发我的cellForRow
,以便创建和插入适当的单元格。
这里的问题是它短暂地显示了单元格的上一个 内容。
即使我在我的自定义 UICollectionViewCell
类中得到了这个:
override func prepareForReuse()
super.prepareForReuse()
self.mediaContainer = nil
self.outletTitle.text = ""
self.outletImage.image = nil
self.outletButtonAction = nil
self.bottomView = nil
我是否以错误的方式使用prepareForReuse
?
我应该在插入之前致电reloadItemsAtIndexPath
吗?
这是我的 cellForRow :
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
Object *object = [_datasource objectAtIndex:indexPath.row];
UICollectionViewCell *cell = nil;
switch (object.type.intValue)
case CELLTYPE1... :
// specific cases for specific cell type
.
.
.
case CELLTYPE2:
static BOOL nibMyCellloaded = NO;
if (!nibMyCellloaded)
UINib *nib = [UINib nibWithNibName:@"CustomCollectionViewCell" bundle:nil];
[self.collectionView registerNib:nib forCellWithReuseIdentifier:@"reuseId"];
CustomCollectionViewCell* customCell = (CustomCollectionViewCell*)[self.collectionView dequeueReusableCellWithReuseIdentifier:@"reuseId" forIndexPath:indexPath];
[customCell updateCellOutletWith:_customView vc:self];
cell = customCell;
break;
return cell;
【问题讨论】:
在cellForItemAt
使用dequeueReusableCell(withReuseIdentifier: cell, for: indexPath)
并使用reloadItemsAtIndexPath
在prepareForReuse
中放置一个断点。另外,尝试使用performBatchUpdates
添加新项目。
我认为你应该先在数组中插入项目而不是 reloadItemsAtIndexPath。稍后处理要显示的内容或处理对 cellforrow 进行检查的 celldeque 问题。
显示您的cellForItemAtIndexPath
代码
【参考方案1】:
您应该在 prepareForReuse()
中将 outlets 设置为 nil
,因为不会再次从 Storyboard 或 NIB 加载单元格。只需重置您的内容(例如文本、图像、控制值)。您可以使用以下经验法则:仅重置您在cellForRow()
中设置的prepareForReuse()
中的值。
当您的 outlet 设置为 nil
时,cellForRow()
无法为视图分配新值,因此您将看到旧值。
【讨论】:
不,您将mediaContainer
和 bottomView
设置为 nil
。以上是关于iOS - 如何在将单元格动态插入 UICollectionView 之前正确重新加载单元格的主要内容,如果未能解决你的问题,请参考以下文章
根据内容动态调整tableview单元格的高度 - iOS Swift
如何在具有动态大小的单元格的 UICollectionViewFlowLayout 子类上正确设置节插入
如何管理 UITableView + 动态自定义单元格(UIBUtton + UITextField + UIBUtton)插入?