2017-06-13 9 views
2

投稿のUITableViewがあります。
投稿のIDがsqliteに保存されています
オレンジ色の記事や黒色の記事を見せたいと思います。
しかし、私はwillDisplayCellメソッドで見たポストのためにオレンジ色を設定すると、いくつかのセルがオレンジ色に間違って色付けされます。そうでなければ、印刷ログ( "Color it")は正しいです。UITableView willDisplayCellメソッドの不具合

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
    let post = postDataSource.posts[indexPath.row] 
    print(post.id) 
    let cellPost = cell as? PostListViewCell 

    if post.isRead.boolValue == true { 
     print("Color it") 
     cellPost!.body.textColor = UIColor.orangeColor() 
     cellPost!.title.textColor = UIColor.orangeColor() 
    } 
} 

たとえば、1つの投稿だけが表示されている場合、「カラー」が1回印刷されます。それは正しい。しかし、他のいくつかのセルは、 "Color it"ログなしでオレンジ色に着色されています。

+0

CellForRowAtIndexPathを使用してセルのスタイルを設定しない理由は何ですか? –

+0

カスタムセルを使用する – Developer

+0

@SandeepBhandari DataSourceでCellForRowAtIndexPathを使用しましたが、データソースでスタイルを設定したくありません –

答えて

2

かの再利用可能なテーブルビューセルオブジェクトの声明

if (post.isRead.boolValue == true) { 
    print("Color it") 
    cellPost!.body.textColor = UIColor.orangeColor() 
    cellPost!.title.textColor = UIColor.orangeColor() 
}else{ 
    cellPost!.body.textColor = UIColor.blackColor() 
    cellPost!.title.textColor = UIColor.blackColor()} 
+0

ありがとう。私はこれをしたくありません。私はそれが問題を解決することを知っているが、なぜ私は再び黒の色を黒にする必要がある –

+3

あなたはセルを再利用しているので.. – RJiryes

1

1.Understanding

パフォーマンス上の理由からApple Documentation

から、テーブルビューのデータソースがすべき一般を完了してください再利用 UITableViewCell tableView(_:cellForRowAt :) メソッドで行にセルを割り当てるときに発生します。テーブルビューは、データソースが再利用のためにマークしたオブジェクトまたは UITableViewCell のキューまたはリストを保持します。テーブルビューに新しいセルを指定するように求められたら、データソースオブジェクトからこのメソッドを呼び出します。

このメソッドは、既存のセルが使用可能であれば、そのセルをデキューします。または、以前登録したクラスまたはnibファイルを使用して新しいセルを作成します。

再利用可能なセルがなく、クラスまたはnibファイルを登録していない場合、このメソッドはnilを返します。 Apple Documentation

から

prepareForReuseの2.Usage()

はのUITableViewCellオブジェクトは再利用可能、つまり、再利用識別子この方法は、オブジェクトがから返される直前に呼び出されたされた場合UITableViewメソッド dequeueReusableCell(withIdentifier :) です。パフォーマンス上の理由から、

に関連しないセルの属性(アルファ、編集、選択状態など)のみをリセットする必要があります。

のtableViewのテーブルビューのデリゲート(_:セルを再利用する際にcellForRowAt :) は常にすべてのコンテンツをリセットする必要があります。セルオブジェクトに関連する再利用識別子がない場合、このメソッドは呼び出されません。このメソッドをオーバーライドする場合は、必ずスーパークラスの実装を呼び出す必要があります。

すでに@RJiryesで記述されているセルの属性を手動でリセットする別の方法です。