删除子视图,然后将其添加回来

我有一个渐变子视图的UICollectionViewCell 。 在我的视图控制器,我有buttonsortingCoreData,然后在UICollectionView reloadData() 。 为了避免我的渐变子视图被一次又一次地绘制(就像它发生在过去一样),我在prepareForReuse()实现了removeFromSuperview() prepareForReuse() 。 在那里,我还实现了一个标志,以跟踪渐变的存在,所以当单元格加载时,我仍然添加一个新的渐变。 但是在删除渐变后,我的willMove(toSuperview: )不起作用,并且不显示渐变视图。 我的逻辑有什么问题?

 class CollectionCell: UICollectionViewCell { @IBOutlet weak var mealImg: UIImageView! @IBOutlet weak var mealTitleLbl: UILabel! @IBOutlet weak var gradientView: UIView! var gradientWasRemoved = false func configureCell(meal: Meal) { mealTitleLbl.text = meal.title let img = meal.getMealImage() mealImg.image = img addGradient() } func addGradient () { let gradient = CAGradientLayer() gradient.frame = gradientView.bounds let topColor = UIColor(red:0.07, green:0.07, blue:0.07, alpha:1) let botomColor = UIColor.clear gradient.colors = [topColor.cgColor, botomColor.cgColor] gradientView.layer.insertSublayer(gradient, at: 0) if gradientWasRemoved == true { gradientView.willMove(toSuperview: self) } } override func prepareForReuse() { super.prepareForReuse() gradientView.removeFromSuperview() gradientWasRemoved = true } } 

我能够修复以下的逻辑。 在UICollectionViewCell类中:

 import UIKit class CollectionCell: UICollectionViewCell { @IBOutlet weak var mealImg: UIImageView! @IBOutlet weak var gradientView: UIView! @IBOutlet weak var mealTitleLbl: UILabel! var gradientWasRemoved = false func configureCell(meal: Meal) { mealTitleLbl.text = meal.title let img = meal.getMealImage() mealImg.image = img addGradient() } func addGradient () { let gradient = CAGradientLayer() gradient.frame = gradientView.bounds let topColor = UIColor(red:0.07, green:0.07, blue:0.07, alpha:1) let botomColor = UIColor.clear gradient.colors = [topColor.cgColor, botomColor.cgColor] if gradientWasRemoved == false { gradientView.layer.insertSublayer(gradient, at: 0) } else if gradientWasRemoved == true { self.addSubview(gradientView) } } override func prepareForReuse() { super.prepareForReuse() gradientView.removeFromSuperview() gradientWasRemoved = true } } 

prepareForReuse( )我没有删除gradientView ,我从Superview中删除它。 我在那里设置标志,它被删除。 由于我没有nilgradientView我能够运行addGradient()和访问gradientView.bounds创build新的CGGradientLayer 。 在向gradientView添加新图层之前, if检查,我执行。 如果我们删除了gradientView CGGradientLayer那么我们不会添加新的CGGradientLayer而只需将我们的gradientView放回。 这样我们只添加一次CGGradientLayer到我们的gradientView。

我了解到,通过删除Superview的意见,他们仍然活着,可以编辑。

感谢@Luis和@LeoDabus的贡献。