職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

セルの表示内容が更新されない?!

iOSで UITableView を利用するときのお話です。
タップされたセルにチェックマークを入れているつもりだったのですが、チェックマークが表示されませんでした。
コードは以下の通り。
※関係性の薄いコードは省略しています。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
	UITableViewCell* cell = nil;
	cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
	cell.accessoryType = UITableViewCellAccessoryCheckmark;
}

ここで呼び出してる UITableViewDataSource の tableView: cellForRowAtIndexPath: は確かに UITableViewCell のインスタンスを返してきますが、これって実際に画面に表示されているセルを指し示しているんじゃなくって、「これから新たに表示されるセル」のために返されるんですね(メソッドの中身は自分で実装する訳ですが。笑)。これでは画面上のセルにチェックマークが付かなくて当然です。

正しいコードはこちら。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
	UITableViewCell* cell = nil;
	cell = [tableView cellForRowAtIndexPath:indexPath];
	cell.accessoryType = UITableViewCellAccessoryCheckmark;
}

ここで受け取っている UITableViewCell のインスタンスは実際に画面に表示されているセルを指し示しているので、これでチェックマークが付くようになります。
今更このような罠にハマるとは思ってませんでしたが、やる時はやっちゃうもんです。気を付けます。