ちょっと話題の記事

iOS6 UITableViewのセルの再利用の方法が変わった

2012.10.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

UITableViewのセル再利用のためのメソッドで、dequeueReusableCellWithIdentifier:というメソッドがありますが、それによく似たメソッドdequeueReusableCellWithIdentifier:forIndexPath:がiOS SDK 6.0から追加されたようです。

これは、UICollectionViewの追加と同時にセルの再利用まわりがシンプルにされたことによる変更なので、この事自体は歓迎すべきことです。しかし、iOS SDK 6.0を利用したXcodeでUITableViewControllerのサブクラスを作成すると、デフォルトでこの新しいメソッドが呼ばれるコードがテンプレートに書かれます。それをそのまま対応していないiOS 5.1以前で利用しようとすると"unrecognized selector sent to instance"というエラーを吐いて異常終了してしまいます。

この状況が起こったときに、エラーログ内の問題のセレクタ名の"dequeReuseableCell"まで見た段階で、以前からあるメソッドが呼び出せていないと勘違いしてしまい、引数が一つのメソッドに書き直さなければいけないということに気がつくまで少し時間がかかってしまいました。

iOS 5.1以前のセルの再利用

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    
    // Configure the cell...
    
    return cell;
}

iOS 6.0以降のセルの再利用

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    
    // Configure the cell...
    
    return cell;
}

そもそも、NSInvalidArgumentExceptionで落ちているのでよく考えれば気がつくことなのですが、時間を取られてちょっと悔しかったのでメモ代わりに記事にしました。

次のiOSのアップデートの際には、もっとよくリリースノートを見ようと思いました。