13
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UITableViewのあるセルに設定した値が、他のセルにも反映されてしまう

Last updated at Posted at 2017-06-08

##現象
UITableViewの特定のセルの背景色をif文で変えていたが、
if文の条件に当てはまらないセルの背景色も勝手に変わってしまう。

勝手に変わってしまうセルは、特定のセルの6つ上or下ごと。
(というよりスクロールで当該セルが消えた後に出てくるセルごと)

具体的には、漫画アプリにおいて既読の話数のセルの背景色を変えようとしたところ、
17話目のみが既読であるはずのところ、
11,5話のセルの背景色も既読色に変わってしまっていた。

003.png

##原因
UITableViewのセルの再利用が原因。
再利用時に属性を引き継いでしまっている。

UITableViewはセルの使い回しを考慮した構造になっている
僕が始めたてから数ヶ月の間理解できなかったポイントとして、「セルの使い回し」というUITableViewの構造がありました。画面の上にViewをたくさん置いてしまうと、アプリがどうしても重くなってしまうので、セルは画面の外に出たら一旦画面から外されて、そのまま使いまわされます。その処理を勝手にやってくれるのですが、その部分がブラックボックスになっていて、最初のうちは結構苦しむポイントだと思います。

画面に表示されているセルの個数が5個ならUITableViewは6個か7個くらいしかセルを作らず、その6個か7個を使いまわしています。

参考 : http://blog.morizotter.com/2013/12/24/uitableview-customcell-storyboard/

##対処法
tableViewを描画する処理の中にセルの背景色を初期化する一行を挿入する

※コメントでより良い方法を指摘いただいたので訂正
セルの再利用時に描画の初期化を行う。
その際はセルの再利用時に呼び出されるprepareForReuseメソッドを利用する。

override func prepareForReuse() {
    super.prepareForReuse()
    contentview.backgroundColor = .white
}
13
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?