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() 无法为视图分配新值,因此您将看到旧值。

【讨论】:

不,您将 mediaContainerbottomView 设置为 nil

以上是关于iOS - 如何在将单元格动态插入 UICollectionView 之前正确重新加载单元格的主要内容,如果未能解决你的问题,请参考以下文章

根据内容动态调整tableview单元格的高度 - iOS Swift

如何在具有动态大小的单元格的 UICollectionViewFlowLayout 子类上正确设置节插入

如何使用打字稿在表格的单元格中动态插入锚标记?

如何管理 UITableView + 动态自定义单元格(UIBUtton + UITextField + UIBUtton)插入?

如何在 iOS 中创建具有动态 tableview 高度的动态 tableview 单元格

如何在 iOS 中动态更改 UICollectionView 单元格高度