如何刷新 UITableViewCell 中的 UIImage?

Posted

技术标签:

【中文标题】如何刷新 UITableViewCell 中的 UIImage?【英文标题】:How to refresh an UIImage in an UITableViewCell? 【发布时间】:2015-06-05 13:48:43 【问题描述】:

这就是我创建单元格的方式:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

        let cell = tableView.dequeueReusableCellWithIdentifier("FbFriendCell") as! FbFriendCell
        cell.initialize()
        return cell  

很简单。

在 initialize() 函数中,我下载了一张图片并将其放入 UIImageView 中:

let theImageView = UIImageView(image: userPhoto)
theImageView.frame = CGRect(x: 0, y: 0, width: 80, height: 80)
self.addSubview(theImageView)
theImageView.image = userPhoto
println("The image has been set !")

问题是图像仅在此日志消息后几秒钟出现:

println("The image has been set !")

如何强制重新加载图像?

* 阅读本文 * => 该问题可能与图像位于 UITableViewCell 内的事实密切相关!

【问题讨论】:

发布您用于下载图像的代码。听起来这需要在完成块中处理。 在完成块中处理。 【参考方案1】:

确保更新主队列中的图像

 dispatch_async(dispatch_get_main_queue(),  () -> Void in
            //Update UI
 )

我以前也有这个问题,这解决了我的问题。试试吧

【讨论】:

【参考方案2】:

我认为您是异步下载图像的。当程序到达 println("The image has been set !") 行时会显示您的日志,但实际上您的图像尚未下载。您应该将日志移动到下载回调的末尾,然后日志应该会在图像出现时及时出现。

另外,这也可能发生,因为您没有在 UI 线程中更新 UIImageView。你可以这样做:

dispatch_async(dispatch_get_main_queue(),  () -> Void in
        //Set image to UIImageView
)

【讨论】:

图像会在几秒钟后显示。如果我是同步设置的话,根本就不会出现。【参考方案3】:

在 Swift3 中有一种更好的方式来访问 UI 线程。

DispatchQueue.main.async() 


有人说这比dispatch_async慢,但是我在实际使用中没看到有什么区别。

【讨论】:

以上是关于如何刷新 UITableViewCell 中的 UIImage?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 UITableViewCell 在部分刷新时丢失其选择状态?

从后台下载图像后如何刷新我的 UITableviewCell

重新加载时,UILabel 在 UITableViewCell 中不刷新

滑动手势取消编辑模式后 UITableViewCell 刷新不良

每次出现新行时如何更新所有可见的 UITableViewCell

如何获得 UITableViewCell 移动开始和结束的通知?