当应用程序从后台进入前台时,UITableViewCell 中的 UIButton 不保留图像?

Posted

技术标签:

【中文标题】当应用程序从后台进入前台时,UITableViewCell 中的 UIButton 不保留图像?【英文标题】:UIButton within UITableViewCell does not retain image when app enters foreground from background? 【发布时间】:2017-04-14 06:43:31 【问题描述】:

我试图了解正在发生的事情,但我对此感到非常困惑。基本上,我有一个UITableViewCell,在那个单元格内我有一个UIBUtton。当表格加载并调用cellForRowAt 时,我设置了UIButton 图像并向其添加目标。

在应用程序进入后台之前,我点击调用我的函数的UIButton。在该函数中,我检查UIButton 的图像是否与我设置的图像相同。

但是,一旦应用程序进入后台然后重新进入前台,当我点击 UIButton 并检查按钮的图像是否与我设置(并且也可见)的图像相同时,它不是?

我不明白为什么应用程序在后台进入前台时没有保留UIButton图像。

这里是一些示例代码:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

    let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! UITableViewCell

    let button = cell.viewWithTag(1) as! UIButton

    button(self, action: #selector(ViewController.checkImage), for: UIControlEvents.touchUpInside)

    button(#imageLiteral(resourceName: "button_stained"), for: UIControlState.normal)



fun checkImage(_ sender: UIButton)

    if sender.currentImage == #imageLiteral(resourceName: "button_stained")
    
        print("TEST")
    

TEST 仅在我的视图控制器加载时最初打印出来。如果我的应用进入后台,然后回到前台,TEST 不会被打印出来。

我也尝试过使用sender.currentImagesender.image(for: .normal) 均无济于事。

有人可以向我解释为什么会这样吗?

这是一个示例项目:

Test

谢谢。

【问题讨论】:

我认为您无法使用 == 比较两个 UIImage 对象,请改为查看 this。 【参考方案1】:

问题在于您的“==”比较。您必须改用 isEqual 。

查看Apple API Reference“比较图像”部分。

【讨论】:

问题仍未通过isEqual 解决。我附上了一个示例项目进行测试。 是的,你是对的。我认为ios在进入后台时会序列化按钮的信息。当进入前台时,它会反序列化按钮。在此过程中,按钮会根据相同的数据创建图像的新实例。图像不包含数据,它只是一个可以创建和缓存数据的对象。因此,直接比较肯定会失败。通常 isEqual 处理指针和内容比较之间的差异,可能是苹果框架中的一个错误..【参考方案2】:

感谢@Rikh 为我指明了正确的方向

我能够使用提供的答案解决问题:

How to compare two UIImage objects

Swift 3.0 更新:

extension UIImage

    func isEqualToImage(image: UIImage) -> Bool
    
        let data1: Data = UIImagePNGRepresentation(self)!
        let data2: Data = UIImagePNGRepresentation(image)!
        return data1 == data2
    

【讨论】:

以上是关于当应用程序从后台进入前台时,UITableViewCell 中的 UIButton 不保留图像?的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序从后台进入前台时,UITableViewCell 中的 UIButton 不保留图像?

当应用程序进入后台时,在前台执行的长时间运行的任务被挂起

Android需要事件前台和后台

当 iphone 应用程序进入后台或前台状态时,如何保存数据?

当应用程序进入暂停状态时取消本地通知。(从后台删除)

当应用程序进入后台和前台时,带有通知中心的登录屏幕,Swift