iOSのTableView

XcodeのStoryboardエディタってとてもありがたい機能だと思います。

便利なものの、使い始め当初、実際のコードとStoryboard上の定義がどう結びつくのかよくわからなくてはまったりしました。その一例がTableViewで、Dynamic Prototypesを使った場合。

最初から入ってるテンプレートプロジェクトにMaster-Detailsアプリケーションがあります。これを使えば任意の数のDetail画面のリストを表示して、遷移させられるのだと思って使い始めて、Cellを動的に追加するようなコードを書いたことがあったのですが、今思えば当然ながら、セルを追加しようとすると怒られて、アプリが落ちます。何故ならテンプレートのデフォルトではTableViewはStaticになっていて、デザイン上定義したPrototypeしか扱えないから。

そこでDynamic Prototypesを選んで下記のようなコードを書くのですが、

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"cellId";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

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

    return cell;
}

これだけではSegueが機能しません。Dynamic Prototypesに設定した後に現れるCellにIDをつけ、それをコード中でCellを生成するときに渡すCellIdentifierと対応させる必要があります。すなわち、Dynamic Prototypesに設定した後に現れるCellのプロトタイプに、上記の例だと”cellId”というIDを与える必要があります。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中