storyboardで設定したcustomのUITableViewCell、設定したのに使えない……というときの対処法

More than 1 year has passed since last update.

背景

iOSアプリ作り始めの頃、UITableViewを使おうとstoryboardを調べ、いろいろ試行錯誤の結果以下のようにボタンとラベルがあるcustomのCellを使うTableViewを用意したことがあります。

Test_—_Main_storyboard.gif

一旦動作確認しようと、cellを10個、適当なlabelを設定して以下の様なコードを書きました。
また、XCode上でUITableViewControllerUITableViewCellには以下のコードのclassを指定しています。

ViewController.m
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self.tableView registerClass:[SampleTableViewCell class] forCellReuseIdentifier:@"MainCell"];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 10;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    SampleTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MainCell" forIndexPath:indexPath];
    cell.label.text = @"test";
    return cell;
}
SampleTableViewCell.h

@interface SampleTableViewCell : UITableViewCell

//それぞれXCode上でIBOutletをつないでおく
@property(nonatomic, weak) IBOutlet UIButton *button;
@property(nonatomic, weak) IBOutlet UILabel *label;

@end

残念なことに、これを実行したら以下のようにcellがひとつも表示されませんでした。

スクリーンショット_2014_04_07_15_49.gif

対処法

ViewController.mのviewDidLoadに書いているregisterClassを消す。

原因

最初のころ何もわからずblogの記事をコピペっていた頃にregisterClassのコードを追加し、そのままstoryboardに移行したため動作しなくなっていました。
storyboard上でUITableViewCellのカスタマイズをするときは、cellIdentifierを登録してdequeueReusableCellWithIdnetifier:forIndexPath:すればよく、registerClassは不要でした。

一方xibでUITableViewCellを作った時にはregisterNib:for CellReuseIdentifierをする必要があった。このためregisterClassを書く必要があると思い込んでいました。

備考

特定のUITableViewだけで使うUITableViewCellを定義する場合はstoryboard上で定義すると楽ちんですが、cellを使いまわしたいときは以下の記事のようにcellだけ別のxibとして定義するほうが便利です。

iOS - Storyboard上のUITableViewCellをxibで作る場合はregisterNib:forCellReuseIdentifier:メソッドが便利 - Qiita