使用相同的默认 UIImage 对象进行单元重用/初始化

Posted

技术标签:

【中文标题】使用相同的默认 UIImage 对象进行单元重用/初始化【英文标题】:Using same default UIImage object for cell reuse/initialisation 【发布时间】:2018-12-29 10:38:48 【问题描述】:

我对在tableView 委托方法_cellForRowAtIndexPath_ 中的单元格配置期间使用存储在Assests.xcassets 中的默认UIImage 存有疑问。考虑以下代码 sn-p:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier:newItemCellResueId , for: indexPath) as? MyCustomCell
    cell?.imageView?.image = defaultImage
    //After this we do all other stuff that needs to be done with the cell
    return cell

其中 defaultImage 是我的类的存储属性,初始化如下:-

var defaultImage = UIImage(named: "Default") 

现在我的问题是这个。由于 image 是单元格 imageView 的子视图,因此当我将单元格的 imageView.image 设置为等于我存储的属性的实例时,我假设它将被添加为子视图到该单元格的 imageView。如果是这样,单个默认 UIImage 实例如何作为子视图添加到多个单元格?如果不是,它是否会生成此 UIImage 的不同实例并将它们添加到单元格中?如果是,我们为什么不担心所有这些 defaultImage 实例的内存占用(缓存等)(就像我们为 TableViewControllers 异步获取的图像所做的那样)

【问题讨论】:

图片不是子视图。 UIImage 不继承自 UIView。图像在图像视图中呈现。它本质上是一个位图。该位图可以同时由任意数量的UIImageViews 渲染。 【参考方案1】:

UIImage 不是UIView 的子类,也不会添加为UIImageView 的子视图。 UIImageView 是一个UIView,可以渲染一个UIImage

由于UIImage 是一个不可变对象,多个UIImageViews 可以安全地引用同一个UIImage

UIImage(named:) 初始化器使用内部内存缓存,因此无论您是对默认图像使用单个属性,还是重复使用 UIImage(named:) 初始化器,都不会影响应用的内存占用。

【讨论】:

【参考方案2】:

由于图像是单元格的 imageView 的子视图

不,不是。 image 只是 UIImageView 的属性,类型为 UIImage? 的图像,显​​示在图像视图中 (docs)。

现在,如果您有单元格的默认图像,您不必担心“内存占用”,您可以将其设置在 cellForRowAt

cell?.imageView?.image = UIImage(named: "Default") 

【讨论】:

【参考方案3】:

试试这个。

    从 Assets.xcassets 添加新的图像集。并将其命名为“测试”

    它将打印带有 5 个时间图像的 tableview。

import UIKit

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource 
    @IBOutlet weak var tableView: UITableView!
    override func viewDidLoad() 
        super.viewDidLoad()

        tableView.delegate=self
        tableView.dataSource=self
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell:UITableViewCell = self.tableView.dequeueReusableCell(withIdentifier:"cell") as UITableViewCell!
        cell.imageView?.image=UIImage(named:"test")
        return cell
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 5
    


【讨论】:

以上是关于使用相同的默认 UIImage 对象进行单元重用/初始化的主要内容,如果未能解决你的问题,请参考以下文章

使用 SDWebImage 为 UICollectionView 可重用单元从路径加载图像 - Swift

自定义 UITableView 单元格图像转换未应用于可重用单元格

当它们几乎没有区别时,我应该重用 tableView 单元格吗? [关闭]

重用自定义 tableView 单元格时重复显示相同的子视图(Swift 4.1)

使用子视图重用单元格(以编程方式)

通过点击 collectionViewCell 预览 UIImage