当应用程序从后台进入前台时,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.currentImage
和sender.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 不保留图像?