如何在TableView Cell中停止重复图像

问题描述 投票:0回答:3

我在cellForRowAt方法中以编程方式创建了一个ImageView,并添加到了单元格中:

let imageName = "Default.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image!)
imageView.frame = CGRect(x: 29, y: 17, width: 14, height: 13)
cell.addSubview(imageView)

它有效,没有什么可抱怨的。现在我只想在indexpath.row等于2的情况下显示这个图像,所以我添加了一个简单的if语句:

if indexPath.row == 2 {
    let imageName = "Default.png"
    let image = UIImage(named: imageName)
    let imageView = UIImageView(image: image!)
    imageView.frame = CGRect(x: 29, y: 17, width: 14, height: 13)
    cell.addSubview(imageView)
}

有用。但是当我向下滚动时,一些单元格也有图像。我怀疑在cellForRowAt中有一些错误,所以我在UITableViewCell中添加了方法prepareForReuse来隐藏每个imageView,并且只有当if语句为真时,隐藏才会被删除:

override func prepareForReuse() {
    super.prepareForReuse()
    self.imageView!.isHidden = true
}

if indexPath.row == 2 {
    let imageName = "Default.png"
    let image = UIImage(named: imageName)
    let imageView = UIImageView(image: image!)
    imageView.frame = CGRect(x: 29, y: 17, width: 14, height: 13)
    imageView.isHidden = false
    cell.addSubview(imageView)
}

不幸的是它不起作用,我不知道我可以改进什么。

ios swift tableview cell
3个回答
1
投票

你单元格的子类中的prepareForReuse引用了子类'property imageView并将其设置为隐藏。但是,在if语句中,您正在创建新的图像视图并将其添加到单元格的层次结构中。这是一个坏主意,因为它永远不会被删除,并且当您滚动时会添加越来越多的内容。

相反,引用单元格的图像视图:

if indexPath.row == 2 {
    let imageName = "Default.png"
    let image = UIImage(named: imageName)
    cell.imageView?.image = image
    cell.imageView?.isHidden = false
}

0
投票

cellForRowAt中添加带有空imageView的else部分来解决此问题。

if indexPath.row == 2 {
  let imageName = "Default.png"
  let image = UIImage(named: imageName)
  let imageView = UIImageView(image: image!)
  imageView.frame = CGRect(x: 29, y: 17, width: 14, height: 13)
  cell.addSubview(imageView)
} else { // ## Add this else methode.
  let imageView = UIImageView()
  imageView.frame = CGRect(x: 29, y: 17, width: 14, height: 13)
  cell.addSubview(imageView)
}

0
投票

嗨你的代码的问题是当单元格被重用时,imageView仍然在层次结构中,所以在prepareForReuse中删除类型为图像视图的子视图也只是因为单元格已经有默认的imageview所以创建一个新的imageView类并删除那个特定的类型,我为它添加代码,希望它帮助:)。

 class CustomImageView : UIImageView { //CustomImageView


}
func removeCustomImageViewIfNeeded() {

     self.subviews.forEach { (subView) in
        if subView is CustomImageView {
            subView.removeFromSuperview()
        }
    }
}

override func prepareForReuse() {
    super.prepareForReuse()
    removeCustomImageViewIfNeeded()
}

if indexPath.row == 2 {
let imageName = "Default.png"
let image = UIImage(named: imageName)
let imageView = CustomImageView(image: image!)
imageView.frame = CGRect(x: 29, y: 17, width: 14, height: 13)
imageView.isHidden = false
cell.addSubview(imageView)

}else {
removeCustomImageViewIfNeeded()
 }
© www.soinside.com 2019 - 2024. All rights reserved.