swift:tableview图像冻结

时间:2017-08-14 08:32:35

标签: ios swift

我的Xcode swift项目中有{10}行的uitableview。我使用此代码在uitableview

中显示10行图像
 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: String(format: "Cell0", indexPath.row), for: indexPath)


    var imageV = UIImageView()
    imageV = cell.viewWithTag(5) as! UIImageView

    imageV.image = UIImage(named:"image\(indexPath.row + 1).png")

但是当我非常非常努力地滚动uitableview冻结时。为什么会这样?以及如何解决它?

3 个答案:

答案 0 :(得分:2)

创建自定义单元格

class MyCustomCell: UITableViewCell {
    @IBOutlet weak var imgView: UIImageView!
}

在您的故事板中,将单元格的类设置为MyCustomCell,并为其指定一个标识符cell

然后,更新您的cellForRow方法,如下所示

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyCustomCell

    let imageName = "image\(indexPath.row + 1).png"
    cell.imgView.image = UIImage(named: imageName)
    return cell
}

<强>更新

  • 创建一个名为MyCustomCell.swift的新swift文件 enter image description here
  • 在情节提要中,将单元格的类设置为MyCustomCell enter image description here
  • 在您的单元格中添加UIImageView enter image description here
  • 连接@IBOutlet enter image description here
  • 设置单元格的标识符 enter image description here
  • 更新您的cellForRow方法 enter image description here

答案 1 :(得分:0)

由于CellForRow的工作原理,tableview在滚动方面滞后和冻结。实质上,操作系统不会保存显示的单元格。例如,行1-2-3显示在屏幕上并且已经过了cellForRow。将要显示第4行,并且将从屏幕上移除第1行。第4行将通过cellForRow显示它的信息,一旦第1行离开屏幕,它将从内存中删除。因此,如果您再滚动回第1行,它将通过cellForRow并重新加载图像。因此,在这种情况下,当您向上和向下滚动时,您的tableview会不断地从包中加载图像。

您的解决方案可能是预加载所有图像并将它们放在一个阵列中,以便操作系统不必花时间重复加载图像。另一种方法可能是创建一个自定义单元格,只需让单元格句柄通过提供图像名称来加载它自己的图像,而不是让tableview重复管理每个单元格图像的加载。这也可以清理你的cellForRow。

例如:创建一个名为imageCell的新tableViewCell,它具有一个可以是String的imageName属性。一旦制作了单元格,你只需在cellForRow中传递它的图像字符串,并且当创建imageCell时,让它通过它的awakeFromNib中的字符串加载它自己的图像。

答案 2 :(得分:0)

let cell = tableView.dequeueReusableCell(withIdentifier: String(format: "Cell0", indexPath.row), for: indexPath)

let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)  as CustomCell
cell.imageView.image = UIImage(named: "yourimagename")

每次都不要更改可重复使用的标识符。这会导致你的情况冻结。此外,创建自定义单元格以添加 UIImage