2017-05-30 4 views
-1

UICollectionViewCellカスタムで問題が発生しています。コレクションビューをリロードしたときに直前のセルのデータをすばやく見ることができます。しかし、細胞は最終的に正しいデータで終わる。UICollectionViewCellは、値を設定すると直前のセルからのデータをすぐに表示します。

私のカスタムセルにfunc collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {}デリゲートメソッドのタイトルを設定しているUIButtonがあります。

私は、たとえば、cell.myButton.setTitle("", for: .normal)を使用して、実際に使用したいタイトルを設定する前に、コレクションビューの各アイテムに設定されていた以前の値を "クリア"しようとしました。

何が原因なのでしょうか?

ご協力いただきありがとうございます。

+0

新しいデータを表示する前に、以前のセルのデータを画像などがあればnilに設定します。 –

+0

'dispatch_async()'コールを使って値を設定していますか? 'collectionView:cellForItemAtIndexPath:'はメインキュー上で実行されるはずなので、GCDを使うのは無意味で、ディスパッチと実際にその特定のタスクを実行する間に "遅れ"を起こします。そのデリゲートメソッドの実際の実装は何ですか? –

+0

回答ありがとうございました。ボタンタイプを「カスタム」に変更しました。これはこの問題を修正しています。あなたが知りたいと思うアイデアがあれば、どうして全然分かりませんか、ありがとう! – Dayna

答えて

0

この問題は通常、データを正しく設定しなかった場合に発生します。以下の例のように、アルファベット配列を使用してコレクションビューデータを設定しました。 cellForItemAtメソッドでは、アルファベットがAと等しい場合にのみボタンのタイトルを設定します。これは、セルが "A"に等しくないときの状況を処理しなかったために点滅する問題を引き起こします。それを修正するために、我々はすでに(そのあなたの問題を解決する方法がわからないcustomにボタンタイプを設定するの周りの仕事を考え出したけれども、それは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

と等しくないときの状態を処理する必要がありますしかし、単にcellForRowAtIndexPathがすでにロードされているセルをクリーニングするのに最適な場所ではないことを知りたいと思っていました。

カスタムセルがある場合は、prepareForReuse()をオーバーライドして再利用する前にセルをクリアすることを検討する必要があります。

override func prepareForReuse() { 
    //clear your cell here 
} 
関連する問題