将 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 将图像传递给另一个视图控制器