StoryBoard上で定義したUITableViewCell(Static Cells)が取得できない

最新のXcodeとStoryBoardを使うことで従来よりも直感的で柔軟なアプリケーションを開発することができる。

私が特に気に入っているのはこのスクリーンショットのように、UITableViewを配置した所にラベルやテキストフィールド使ってWISYWIGでカスタマイズしたUITableViewCellをアプリケーションで直接使う方法である。

InterfaceBuilder上ではセルのデザインを見ながらカスタマイズ出来、xib(nib)のメカニズムによりランタイムにIBOutletによりコード上にオブジェクトに紐付けすることができる。 この方法により直感的なデザインとGUIとコードの結合を緩くすることができる素晴らしい技術だ (他の開発環境ではMicrosoftのBlendとXAMLに似たものを見ることができるが、コードとの結合性はxibよりは高い。xibはランタイムで紐付けられるクラスを別途指定できる)

InterfaceBuilder上でカスタマイズしたセル(UITableViewCell)は使用方法(Content)を二通り選ぶことが出来る。

Dynamic Prototypes

データソースに接続して内容を動的に変更することを前提にしたセル(TableViewSectionが生成されない)

Static Cells

InterfaceBuilderでデザインしたセルがそのままインスタンスとして生成される(IBOutletで接続できる)


さてここから本題。

いずれかの使用方法を選んでInterfaceBuilderで生成したセル(UITableViewCell)は、Identifireにセルを識別するための名前を付けておき、実際にUITableViewのデリゲートで以下のように取得して使う。

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    NSString* cellIdentifier = @"Cell";
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    return cell;
}

このイディオムは"Dynamic Prototypes"でも"Static Cells"でも使えるはずなのだが、実際には"Static Cells"では以下の例外が発生してしまう。

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

実際にブレークしてみると変数"cell"には戻るはずの無いnilが返っているようだ。

StroryBoardを使用して"Static Cells"を指定した場合、セルがnilで戻ることは無いはずなのだがバグだろうか、それともAppleの例のようにIBOutletで接続しないと駄目なだけなのか、今ひとつ判らない。
Converting to Storyboards Release Notes


PS.
この挙動、StoryBoard以前はFAQであり例外を回避するために、以下のようなコードを書いていた。

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    NSString* cellIdentifier = @"Cell";
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (cell == nil)
    {
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    return cell;
}