我的Xcode swift项目中有{10}行的uitableview
。我使用此代码在uitableview
:
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
冻结时。为什么会这样?以及如何解决它?
答案 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
}
<强>更新强>
答案 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 。