テーブルビューコントローラを NIB なしで生成した時に必要なコード

SPECIAL


UITableView の表示時に例外エラーが発生する

UITableViewController から派生したクラスを Xcode 4.3.2 で生成すると、最低限必要なコードが自動的に生成されるようになっています。

ただ、このソースコードは NIB やストーリーボードなどを使ってインスタンスを生成したときに必要なコードが最低限あるだけなので、NIB を使わずにインスタンスを生成すると、テーブルビュー表示時に、次のようなエラーが発生してアプリが落ちてしまいました。

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'

これは、UITableViewController が UITableViewCell のインスタンスを再利用しようとする際に、そもそも利用できる UITableViewCell が見つからず、tableView:cellForRowAtIndexPath: メソッドが nil を返してしまうことが原因です。

NIB であれば NIB 内で定義されている UITableViewCell が dequeueReusableCellWithIdentifier: メソッドで取得されるのですけど、NIB を使っていない場合、これが nil を返します。

 

そのため、tableView:cellForRowAtIndexPath: メソッドに、次のように cell が nil だった場合には UITableViewCell インスタンスを生成するコードを追記しておく必要があります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

 

// セルが取得できなかったら、インスタンスを生成するコードを追加します。

if (cell == nil)

{

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

}

 

// 取得または生成したセルに値を設定するコードはここに記載します。

 

 

return cell;

}

このようにすることで、UITableViewCell が無かったときには生成し、あれば再利用するコードが出来上がりました。

 

このようなコードにしておくことで、次のようにプログラムだけで UITableViewController のインスタンスを生成して、テーブルを使用することができます。

UITableViewController* controller = [[UITableViewController alloc] initWithStyle:UITableViewStyleGrouped];

 

[self.navigationController pushViewController:controller];

たとえばこのようにして、グループに分けて表示される UITableView が画面に表示されました。