MENU
コンテンツ再構築中

Objective-C:UITableViewCell を再利用した場合、画面スクロールでセルが重複表示される

UITableViewの中で、セクションごとに UITableViewCell を使う場合、テーブル全体がスクリーン内に収まる場合は問題ないが、表示が画面サイズ内に収まりきらないとき、新しく描画されたセルにデータが重複して表示されてしまう。

この問題の解決に少しはまってしまったのでメモ。

INDEX

UITableViewCell の再利用についての注意点

ソースコード内のコメントを参考にコーディングする。

[code]
– (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//このセルの識別子とインスタンスをセクション分岐で再利用すると意図しない表示になる
static NSString *CellIdentifier = @”Cell”;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
}
if( indexPath.section == 0 )
{
//ここにはユニークな識別子とインスタンスを定義
}
if( indexPath.section == 1 )
{
//ここにはユニークな識別子とインスタンスを定義
}
return cell;
}
[/code]

セクションごとに表示するセルを、一番最初に定義したインスタンスを再利用したとき、画面をスライドさせるたびセル定義のメソッドが呼ばれ表示部分が入れ替わるときに、配列に格納された情報が最初から読み込まれるため、表示の重複が発生する。

セクションごとにセルの識別子(CellIdentifier)を定義すればこういった問題は発生しない。コードの重複は気にせず最初からこうするべきだった。

まとめ

テーブルに表示する行が少ないときは正常に表示されてしまうため発見が遅れ、対処するのに結構な時間を浪費してしまった。。。

いい加減Objective-Cのテーブルの扱いには慣れたいものだ。

Please share it!
  • URLをコピーしました!
  • URLをコピーしました!
INDEX