2017-05-30 35 views
-1

我遇到了自定義UICollectionViewCell問題,我可以在重新加載集合視圖時快速查看前一個單元格中的數據。但是,電池最終會以正確的數據結束。當設置值時,UICollectionViewCell快速顯示前一個單元格中的數據

我的自定義單元格有一個UIButton,我正在設置func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {}委託方法的標題。

我已經嘗試過,例如:cell.myButton.setTitle("", for: .normal)在設置我希望使用的實際標題之前「清除」之前在集合視圖中爲每個項目設置的值。

任何想法可能導致這種情況?

感謝您的幫助提前!

+0

將前一個單元格的數據設置爲nil,如果它們在顯示新數據之前有圖像或其他東西。 –

+0

您是否使用'dispatch_async()'調用來設置值? 'collectionView:cellForItemAtIndexPath:'應該在主隊列上運行,所以使用GCD是沒有意義的,並且會在調度和實際執行特定任務之間造成「滯後」。那個委託方法的實際實現是什麼? –

+0

感謝您的回覆,夥計們。我已將我的按鈕類型更改爲「自定義」,正在解決此問題。不完全確定爲什麼,如果你有任何我想知道的想法,謝謝! – Dayna

回答

0

當您沒有正確設置數據時,通常會發生此問題。如下例所示,使用字母數組來填充集合視圖數據。在cellForItemAt方法中,我們只在字母等於A時設置按鈕標題。這會導致閃爍的問題,因爲當單元格不等於「A」時我們沒有處理這種情況。爲了解決這個問題,我們需要處理的條件時,它不等於A.

let alphabets = ["A", "C", "A", "D", "E"] 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellIdentifier", for: indexPath) 
    let alphabet = alphabets[index.row] 
    if alphabet == "A" { 
     cell.myButton.setTitle("Success", for: .normal) 
    } 

    // To fix it, handle the case when alphabet is not equal to "A" 
    else { 
     cell.myButton.setTitle("", for: .normal) 
    } 

    return cell 
} 
+0

嗨,感謝您的回覆,非常感謝。我剛剛發現,如果我設置按鈕鍵入「自定義」,我不再有這個問題。很奇怪,我不知道爲什麼這個修復它。 – Dayna

+0

歡迎。是的很奇怪。 – muazhud

+0

我建議你總是使用你的按鈕的自定義值,因爲系統按鈕有一些默認樣式,根據文檔:「系統樣式按鈕,如導航欄和工具欄中顯示的那些按鈕。」 – Beninho85

0

雖然你已經想通了周圍的按鈕類型設置爲custom的工作(我不知道如何解決它您的問題雖然),只是想讓你知道cellForRowAtIndexPath不是清理已經加載的單元格的好地方。

如果你有你的自定義單元格,那麼你應該考慮重寫prepareForReuse()並清除單元格,然後重用它。

override func prepareForReuse() { 
    //clear your cell here 
} 
相關問題