iOS6以降でのUITableViewのセル再利用

ようやく理解できたので書きます。

以前、UITableViewでのUITableViewCellの生成方法を記載しましたがiOS6以降はUICollectionViewの追加に合わせてセルの再利用の方法も追加されていました。

以前書いたセル生成

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

UICollectionViewCellの生成

UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Hoge" forIndexPath:indexPath];

iOS6以降でのUITableViewCellの生成方法

dequeueReusableCellWithReuseIdentifier:forIndexPathを使います。

公式リファレンス

Apple Developer Documentation

dequeueReusableCellWithReuseIdentifierを使用したセル生成では、指定したIdentifierのセルが存在しない場合返り値はnilです。
その為nilを考慮した記述をする必要がありました。

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
}

nilが帰ってきた場合はセルを生成しています。

dequeueReusableCellWithReuseIdentifier:forIndexPathでは予めIdentifierを設定したセルを用意する必要があるため必ず返り値はUITableViewCellになります。
Identifierを設定したUITableViewCellがないとビルドが通りません。
これは↑でUICollectionViewCellの時に遭遇した記事を貼っていますがそれと同じことです。

公式リファレンスでも触れられています。

Important: You must register a class or nib file using the registerNib:forCellReuseIdentifier: or registerClass:forCellReuseIdentifier: method before calling this method.

参考リンク先でも記載されていますがコード上でIdentifierを設定する際は下記をviewDidLoad内に記述します。

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];

StoryBoardで設定することも出来ます。StoryBoardでUITableViewCellを指定した時に
Attributes inspecterのIdentifierに記述すればOKです。
f:id:arcright:20140903141220p:plain