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