LoginSignup
87
83

More than 5 years have passed since last update.

UITableViewCellを継承して、コードからカスタムセルを作る

Last updated at Posted at 2014-02-05

xibファイルを使って、というのはすぐ見つかるのにコードからというのは少なかったのでメモしておきます。

作成フロー

  1. UITableViewCellを継承したサブクラスを作る
  2. Cell生成時に配置したい要素を生成、addSubview:メソッドで追加
  3. UITableViewControllerのデリゲートメソッドが呼ばれた際に適切にキャストして生成
  4. 以降は通常のセルと同様にアップデートしていく

UITableViewCellを継承したサブクラスを作る

なにはともあれ、UITableViewCellを継承したクラスを生成します。
そして初期化時に色々と必要な要素をレイアウトしていきます。UILabelだったりUIViewだったり。
生成したパーツは[self addSubview:label];のようにして、自身に追加します。(もしかしたらcontentViewに追加してもいいかも?)

コメントでより便利な生成方法を教えて頂きました。

サンプルコード

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

    if (self) {
        //メインテキスト
        self.titleLabel  = [[UILabel alloc] initWithFrame:CGRectMake(padding, padding, 240, 40)];
        self.titleLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth;
        self.titleLabel.font = [UIFont systemFontOfSize:15];
        self.titleLabel.numberOfLines = 2;

        //ドキュメントによると、self.contentViewに追加するのが正しいとコメントいただきました。
        [self.contentView addSubview:self.titleLabel];

        //...以下パーツを色々生成・追加
    }

    //レイアウトをアップデート
    [self updateLayout];

    return self;
}

[追記] tableViewに、セルとして使うクラスを登録(registerClass:forCellReuseIdentifier:)

コメントで教えていただいた部分。以下のように、tableViewのセットアップ時に使用するセルを登録することで、再利用可能セルのチェックを省いて簡潔に書くことができるようになります。

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.tableView registerClass:[HogeCell class] forCellReuseIdentifier:@"Cell"];

    //その他の処理
}

UITableViewControllerのデリゲートメソッドが呼ばれたときにキャストして生成

実際のコードは以下。(registerClass:forCellReuseIdentifier:メソッドを利用したものに変更)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //IDをstatic変数で宣言
    static NSString *CellIdentifier = @"Cell";

    //使用可能なセルを取得
    HogeTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    //registerClass:forCellReuseIdentifier:メソッドを使った場合はチェック不要
    //if (cell == nil) {//再利用できるセルがなければ新規作成
        //cell = [[HogeTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    //}

    //ここから実際のセルのアップデート処理を書く
    cell.hogeLabel.text = @"hoge的な";

    //セットアップしたセルを返す
    return cell;
}

layoutSubviews:メソッドでレイアウトを調整

最後に、色々配置した場合、縦横の回転に合わせてちゃんとレイアウトしなければなりません。
画面回転時、UITableViewCellもUIViewが持っているlayoutSubviews:デリゲートメソッドが呼ばれるので、そこでカスタマイズしたパーツのレイアウトを調整してやります。

これで無事、カスタムセルで表示ができるようになります。

87
83
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
87
83