Posted at

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

More than 5 years have 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