UITableViewのカスタムセル改訂版

2011/04/30

iOS4.3 にしてから カスタムセルを利用した UITableView の描画処理でクラッシュしてしまった。 以前のカスタムセルの処理(セルの再利用)がまずかったようだ。

UITableViewCell の拡張ファイル作成

#import 

@interface SongListCell : UITableViewCell {
    UILabel *songNameField;
    UILabel *artistNameField;
}

@property(nonatomic ,retain) IBOutlet UILabel *songNameField;
@property(nonatomic ,retain) IBOutlet UILabel *artistNameField;

@end

UIViewController の拡張ファイル作成

#import 
#import "SongListCell.h"

@interface SongListCellController : UIViewController {
    SongListCell *cell;
}

@property(nonatomic ,retain) IBOutlet SongListCell *cell;

@end

カスタムセル用の xibファイル作成

カスタムセル用の xibファイル作成して、UITableViewCell と UIView を配置する。

・File's Owner:SongListCellController ・UITableViewCell :SongListCell

iPhone

ここでポイントは、File's Owner の view と cell を UITableViewCell にバインドします。 iPhone

あとは、UILabelなどに表示したいデータフィールドをバインドします。 iPhone

UITableView での表示

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *identifier = @"SongListCell";
    SongListCell *cell = (SongListCell *)[tableView dequeueReusableCellWithIdentifier:identifier];
    if (cell == nil) {
        SongListCellController *controller = [[SongListCellController alloc] initWithNibName:identifier bundle:nil];
        cell = (SongListCell *)controller.view;
        [controller release];
    }
    [self configureCell:cell atIndexPath:indexPath];
    
    return cell;
}

カスタムセルコントローラー ListCellController をxib で initWithNibName する。 コントローラの view を カスタムセルクラスに受け渡します。 この時 ListCellController は release します。