UITableViewの振る舞いが解らない
前にも書いたがターゲットをiOS5、StoryBoardを使って作る画面、UITableViewControllerを使う画面でアプリケーションを作る場合、UITableViewが扱うUITableViewCellのモードとしては"Static Cells"又は"Dynamic Prototypes"を選択できる。
前者はInterfaceBuilderを使って構成したWISYWIGなセルのインスタンスをそのまま(静的に)使うモードであり、後者はテンプレートとして用意されたセルをUITableView内でシェアするモードである。それぞれ、デリゲートメソッド-tableView:indexPathでセルを取得するためのメソッドが用意されており、それぞれ以下のように使える。
Static Cells使用時
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //Static Cellsはxibによりインスタンス化されたUITableViewCellを行に合わせて取得する UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath]; }
Dynamic Prototypes使用時
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //Dynamic PrototypesはキューイングされているテンプレートとしてのUITableViewCellを識別名で取得する UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"セル識別名"]; }
以前はこれらのメソッドでnilが戻るのを考慮して、例えばDynamic Prototypesでは以下のようなメソッドで回避していたそうだ。
if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"セル識別名"]; }
最新のXcode、StoryBoardを使用したUITableViewを使うケースでは上述したメソッドでは既にnilは戻らないと聞いていたのだが、実際にはnilが戻るのだ。
そして、nilが戻る原因が分からない。
UITableViewCellに識別名(Identifier)をきちんと設定することは必要なのは理解しており、Static CellsでもDynamic prototypesでもきちんと設定しているはずなのだがそれでもnilが戻るケースがあるのだ。 かといって設定をし直したりStoryBoardを弄っているとnilが戻らなくなったりするのだ。
nilが戻る原因を特定したいのだが、それがずっと解らないでいる。