UITableViewのStatic Cellsが使えなかったけどstoryboardでできる限りそれっぽくやってみた

Static Cellsを使いたいけどUITableViewController限定...

storyboard上でUITableViewを扱うと「Static Cells」という機能で、複数のセルを思いのままにデザインしてノンプログラミングで並べることができます。

ただし制約があって、Static CellsはUITableViewController上でないと動作しません。むりやり配置すると「error: Illegal Configuration: Static table views are only valid when embedded in UITableViewController instances]」という警告が表示され、もちろん動作しません。

skitched-20120608-221618

しかしUITableViewControllerのView構成は制約が強く、必ず直下にUITableViewが置かれます。固定の背景画像を配置するなどちょっと凝ったことをしようとするには、不便です。

なるべくコードを減らしてStatic Cellsっぽくしてみた

今回、どうしてもViewで凝ったことをしたかったため、Static Cellsを諦め、UIViewControllerでやりくりすることにしました。ただしできるかぎりコードの量は減らすことを考えてやりくりしてみました。

UITableViewのContentはDynamic Prototypesに戻しておきます。

すべてのセルにIdentifierを設定します。

Sandbox.xcodeproj — MainStoryboard.storyboard

すべてのセル名の配列をコントローラ(delegateとなるクラス)に持たせます。

- (void)viewDidLoad
{
    [super viewDidLoad];    
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    self.cellNames = [NSArray arrayWithObjects:@"CellFirst", @"CellSecond", @"CellThird", nil];
}

セルの数は配列の数から返します。

- (NSInteger)tableView:(UITableView *)tableView
  numberOfRowsInSection:(NSInteger)section
{
    return [self.cellNames count];
}

セルのインスタンスはこのようにして返します。

- (UITableViewCell *)tableView:(UITableView *)tableView
  cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellName = [self.cellNames objectAtIndex:indexPath.row];
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:cellName];
    return cell;
}

セルへの名前付けと、セル名の配列さえ管理すればほぼStatic Cellsと同じじゃないかと思います。セルからのsegueもちゃんとセルごとに設定できましたよ。

環境は Xcode 4.3.2 です。

(この記事は$5で24時間以内にブログを1記事書きます。 | vites [バイツ]の受注から24時間以内に書かれました。ただし、記事内容の要望は受け付けていません)

コメント / トラックバック

コメント / トラックバック 2 件

  1. sawat より:

    UITableViewControllerをchildViewCintrollerにして、他のViewControllerに含めるという方法もありますよ。

  2. […] Static Cellsを使いたいけどUITableViewController限定… UIViewController+UITableViewでは、Static Cellsが使えない。 […]