将 UIImage 分配给 Collection View Cell

Posted

技术标签:

【中文标题】将 UIImage 分配给 Collection View Cell【英文标题】:Assigning UIImage to Collection View Cell 【发布时间】:2016-04-19 07:20:07 【问题描述】:

我在 TableViewController 中有一个 CollectionView。集合视图单元用于显示用户的照片。但是,我从数据库中获取的是 url 路径。

我还计划对图像数据进行更多操作,因此我选择将它们存储在数组 profileImages 中(但我不确定是否应该将其用作 NSURL 数组)..

(我也使用 Firebase 作为后端,它会实时监听更改,这就是我设置 isIndexValid 检查部分的原因)

class TableViewController: UITableViewController, UICollectionViewDataSource 

   @IBOutlet weak var collectionView: UICollectionView!

   var profileImages = [NSURL]()

   // Database Checks Hits into `retrievePhotos()`

   func retrieveUserPhotos(user: AnyObject) 
    if let profilePicLink = user["firstImage"]! 
        let firstImagePath = profilePicLink as! String

        if let fileUrl = NSURL(string: firstImagePath) 
            print(fileUrl)
            let isIndexValid = profileImages.indices.contains(0)

            if (!isIndexValid) 
                profileImages.append(fileUrl)
                print(profileImages)
             else 
                profileImages[0] = fileUrl
            
        
     
   

  func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    return 1
  

到目前为止,一切都很好。我现在正在成功获取图片网址。

但此时,我对将图像分配给单元格中的 UIImage 感到困惑。 (我尝试将它与 Heneke 一起使用,因为它看起来更容易)。

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

    let cell = self.collectionView.dequeueReusableCellWithReuseIdentifier("CollectionViewCell", forIndexPath: indexPath) as! CollectionViewCell

    // below returns fatal error `Index out of range`
    cell.currentImage.hnk_setImageFromURL(profileImages[indexPath.row])


    // Also tried this but it doesn't update the UIImage. 
   // I guess it's because it's already loaded once without download of the images from the link get completed:
    if profileImages.count > 0 
      cell.currentImage.hnk_setImageFromURL(profileImages[indexPath.row])
    

    return cell


处理获取图像并分配给集合视图单元的 UIImage 的正确方法是什么?

【问题讨论】:

我更新了我的问题。如果我签入cellForItemAtIndexPath,图像永远不会更新 ***.com/questions/26920632/… 或 natashatherobot.com/… 或 developer.apple.com/library/ios/samplecode/LazyTableImages/… 应该让你上路 后来的答案是collectionView.reloadData().. 稍作调整后,我明白了它的本质。谢谢 您应该查看 reloadRowsAtIndexPaths 而不是 reloadData()。您不想在每次异步操作完成时重新加载整个视图 @Moonwalkr 你能否举一个例子来回答如何实现它?我可以接受你的回答。 collectionView 有 reloadRowsAtIndexPaths 吗? 【参考方案1】:

在哪里调用reloadItemAtIndexPaths 取决于您现在如何解决异步操作。应该为您正在下载的每个图像调用异步操作,以便您可以在获取该行的图像时更新相应的行。在回调或该操作的任何内容中,您调用

collectionView.reloadItemsAtIndexPaths(myArrayOfIndexPaths)

myArrayOfIndexPaths 将只包含一项,即当前行的 indexPath。因此,您将拥有一个使用当前 indexPath 作为参数调用的异步 fetch 方法。你将它添加到一个空的myArrayOfIndexPaths,然后调用 reload。

【讨论】:

首先,我尝试将collectionView.reloadData() 放入底部的retrieveUserPhotos()。它工作得很好,但你上面的评论鼓励我去适应它。但是,现在我尝试将其更改为collectionView.reloadItemsAtIndexPaths(profileImages),但我无法弄清楚要在 pharantesis 里面放什么.. 如果您的“retrieveUserPhotos”正在检索所有照片,那么您并没有在每张照片准备好后立即更新行。然后,您将异步获取所有照片,然后重新加载。在这种情况下,最好使用 reloadData()。但是:这不是一个好的解决方案,因为您正在获取所有照片,即使这可能(可能是?)比您当前显示的更多照片。如果用户有 500 张照片,那么您将在重新加载视图之前获取所有这些照片。非常低效。这就是为什么你应该有一个在每行显示时调用的函数

以上是关于将 UIImage 分配给 Collection View Cell的主要内容,如果未能解决你的问题,请参考以下文章

通过 Collection View Cell Swift 中的 segue 将图像传递给另一个视图控制器

将图像分配给 UIImageView

Mongoose 阻止将默认值分配给枚举

iOS:UIImage 不可分配(FBSDKGraphRequest)

使用普通的 CALayer 显示图像或 UIImage

SWIFT - UIimagepicker 将图像分配到数组中