我在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)
}
不幸的是它不起作用,我不知道我可以改进什么。
你单元格的子类中的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
}
在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)
}
嗨你的代码的问题是当单元格被重用时,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()
}