テーブルビューコントローラを 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 が画面に表示されました。