UICollectionView 未使用自定义 UIViewController 更新

Posted

技术标签:

【中文标题】UICollectionView 未使用自定义 UIViewController 更新【英文标题】:UICollectionView Not Updated with custom UIViewController 【发布时间】:2016-03-29 23:19:36 【问题描述】:

我创建了一个自定义 UIViewController 并将其扩展为实现:UICollectionViewDataSource、UICollectionViewDelegate。在故事板中,我添加了 UICollectionView 并从我的控制器中引用了这个 UICollectionView(并为数据源和集合视图委托设置了委托)。

我显然为这 2 个代表实现了最低要求。现在,因为我有时会异步加载图像,所以我在图像下载完成后调用 cell.setNeedsLayout()、cell.layoutIfNeeded()、cell.setNeedsDisplay() 方法(cell.imageView.image = UIImage(...))。我知道所有这些方法都被调用了。但是,屏幕上的图像没有更新。

我错过了什么吗?谢谢!

编辑:添加示例代码 - 如何调用更新 -

    func collectionView(collectionView: UICollectionView,
    cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MyCollectionViewCell
    ....

    let cellImage = ServiceFacade.sharedInstance.getImageFromCaching(image!.url)
    if cellImage == nil 
        // set image to default image.
        cell.cellImage.image = UIImage(named: "dummy")

        ServiceFacade.sharedInstance.getImage(image!.url, completion:  (dImage, dError) in
            if dError != nil 
               ...
            
            else if dImage != nil 
                dispatch_async(dispatch_get_main_queue(),


                    let thisCell = self.collectionView.dequeueReusableCellWithReuseIdentifier(self.reuseIdentifier, forIndexPath: indexPath) as! MyCollectionViewCell
                    thisCell.cellImage.image = dImage
                    thisCell.setNeedsLayout()
                    thisCell.setNeedsDisplay()
                    thisCell.layoutIfNeeded()
                )

            
            else
                // do nothing
            
        )
    
    else 
        cell.cellImage.image = cellImage!
        cell.setNeedsDisplay()
    

    // Configure the cell
    return cell


【问题讨论】:

你是在主线程下载后设置图片吗?下载完成后,单元格可能为 nil。如果可以在下载设置图片的时候贴出一些代码 Yan,感谢您帮我调查。这是我用来调用单元格更新的代码。但它没有用。 【参考方案1】:

UICollectionView 可能已经缓存了您单元格的中间表示,以便它可以快速滚动。

您应该调用的例程来指示您的单元格需要更新、调整大小并重做它的视觉表示是reloadItemsAtIndexPaths,其中一个索引路径代表您的单元格。

【讨论】:

以上是关于UICollectionView 未使用自定义 UIViewController 更新的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 自定义单元格未重新加载

iOS - 未应用我的 UICollectionViewCell 上的自定义

在 UICollectionView 中通过 NIB 添加自定义单元格

未调用 UICollectionView 方法(collectionView cellForItemAt indexPath)

在 UITextView 上点击时未调用 UICollectionView didSelectItemAtIndexPath

未显示自定义 UICollectionReusableView 元素