2017-01-30 19 views
0

我有一個UICollectionViewCell:失敗reloadData()之後重繪UICollectionViewCell

enter image description here

「梯度視圖」 是具有梯度一個UIView:

enter image description here

數據的源是CoreData。 在收藏觀,我有按鈕那種CoreData:

@IBAction func allMealsBtn(_ sender: Any) { 
    let fetchRequest: NSFetchRequest<Meal> = Meal.fetchRequest() 
    let dateSort = NSSortDescriptor(key: "created", ascending: false) 
    fetchRequest.sortDescriptors = [dateSort] 

    let controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil) 

    controller.delegate = self 
    self.controller = controller 

    do { 
     try controller.performFetch() 
    } catch { 
     let error = error as NSError 
     print("Couldn't fetch data from CoreData with error: \(error.debugDescription)") 
    } 
    collectionView.reloadData() 

} 

按排序按鈕,集合視圖重載後,顯示正確的數據。 但是,漸變視圖會倍增,就像細胞沒有被破壞一樣。 這裏是我的數據多次排序後看到:

enter image description here

如何確保我的手機是從頭開始重繪?

編輯:

我的自定義單元格類。 因此,在configureCell中,我必須檢查我的gradientView是否添加到視圖中,如果是,則添加漸變,如果沒有,添加它並添加漸變。 我該如何做這個檢查?

類CollectionCell:UICollectionViewCell {

@IBOutlet weak var mealImg: UIImageView! 
@IBOutlet weak var mealTitleLbl: UILabel! 
@IBOutlet weak var gradientView: UIView! 

func configureCell(meal: Meal) { 
    mealTitleLbl.text = meal.title 

    let img = meal.getMealImage() 
    mealImg.image = img 

    gradientView.addGradientWithColor(color: UIColor.clear) 

    // How can I check if my gradientView is added to the view, if yes, then add gradient, if not, add it, and only then add gradient. 

} 

override func prepareForReuse() { 
    super.prepareForReuse() 

    gradientView.removeFromSuperview() 
} 
} 

extension UIView { 
func addGradientWithColor(color: UIColor) { 
    let gradient = CAGradientLayer() 
    gradient.frame = self.bounds 
    let topColor = UIColor(red:0.07, green:0.07, blue:0.07, alpha:1) 
    gradient.colors = [topColor.cgColor, color.cgColor] 

    self.layer.insertSublayer(gradient, at: 0) 
} 
} 

編輯: 我已經放棄了擴展並實現了標誌邏輯。 但是,在視圖被移除之後,執行搜索後它再也不會出現在單元格中。 有什麼想法?

class CollectionCell: UICollectionViewCell { 

@IBOutlet weak var mealImg: UIImageView! 
@IBOutlet weak var mealTitleLbl: UILabel! 
@IBOutlet weak var gradientView: UIView! 

var isGradientAdded = false 

func configureCell(meal: Meal) { 
    mealTitleLbl.text = meal.title 

    let img = meal.getMealImage() 
    mealImg.image = img 

    if isGradientAdded == false { 
     addGradient() 
     isGradientAdded = true 
    } 
} 

override func prepareForReuse() { 
    super.prepareForReuse() 

    gradientView.removeFromSuperview() 
} 

    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) 
} 
} 
+0

嘗試覆蓋prepareForReuse方法 –

+0

@WetSweater裏面應該做些什麼? –

+0

您是否在單元格的某處或在collectionView數據源方法中使用了任何「addSubview」方法? –

回答

0

UICollectionViewCell子類(小區),你應該重寫prepeareForReuse功能 - 把電池爲默認模式。

如果沒有自定義類Cell - 之前創建它,並在界面生成器指定爲類的Cell細胞(當然不要忘了網點)

override func prepareForReuse() { 
    super.prepareForReuse() 

    //set cell to initial state here 
    //e.g try to remove you gradient view 
    yourGradientView.removeFromSuperview() 
} 
+0

是的,我沒有添加此代碼到我的自定義單元類。它的工作,但它完全刪除了gradientView。而新的細胞出現沒有它。 –

+0

@Mr_Vlasov好吧,所以嘗試改善你的邏輯,在其中實例化單元格並在其中添加漸變視圖...換句話說,找到適當的位置以添加漸變... –

+0

我已經添加了自定義單元代碼。請考慮我的邏輯並提出改進建議。 –