yaakaito.org

UINib知らずにCellが作れなくて人生半分くらい損した話

InterfaceBuilder, Objective-C, UIKit, iOS

こんにちは!うきょーです! 僕はUIViewとかUITableViewCellを継承してかっちょいいビューを作ろうとすると3分でやる気が消える人なのですが、 最近UINibというものを知りました、創作意欲を返してほしいと思います!!!!

追記しました

続き

みなさんUITableViewCellのサブクラス作りますよね。 そしてそのままコーディングしていくと非常にだるく、3秒でモチベーションがなくなるので、 Interface Builderを使いたい!と思うわけですが、UITableViewCell用のxibファイル作るのは30秒で心が折れる。 (というかいつも忘れるしXcodeのバージョンあがると分からなくなる)

UINibを使う

おもむろにxibファイルを作ります。

UIViewを消します。

UITableViewCellをおきます。

ClassReuse identifiterをセットします。 FilesOwnerのClassはとりあえずUIViewControllerにしておきます。

あとはこれをdatasource側で

1
2
3
4
5
6
7
HogeCell *cell = [tableView dequeueReusableCellWithIdentifier:kHogeCellReuseIdentifier];
if (!cell) {
    UINib *nib = [UINib nibWithNibName:@"HogeCell" bundle:nil];
    cell = [[nib instantiateWithOwner:nil options:nil] objectAtIndex:0];
}

[self updateCell:cell indexPath:indexPath];

とかすれば使えた、泣いた。いままでのよくわからん!はなんだったのか。

細かいところはコードで制御したい

ざっくりとしたレイアウトとかを決めるのはxibで大分楽できるんですが、 もっと細かいところとか、同じようなのだし、まとめて処理してほしい(背景とか)ってときに、毎回xibいじるのはだるいですね。

まあなんだかんだでいろいろコードで弄りたいこととか、コードから追加したい要素とかもあると思うんですが、 これをビューコントローラーからやったりするとゴミみたいなコードになるので、あまりやりたくないわけです。

が、しかしこれはwillMoveToSuperview:あたりをうまく使えば解決できることに気づいて

1
2
3
4
5
6
7
- (void)willMoveToSuperview:(UIView *)newSuperview {

  [super willMoveToSuperview:newSuperview];

  // 共通のスタイルとかコードでやりたい処理書く

}

ってやればあっさりできた、全俺が号泣した。

次にだるいのが

1
2
3
4
5
6
7
8
9
- (void)setHoge:(Hoge *)hoge {

    if (hoge != hoge) {
        _hoge = hoge;

        self.thumbnail.image = hoge.thumbnail;
        self.message.text = hoge.message;
    }
}

こういうの、あると思います。(updateCellとか)

Model-View-Binder使えばうまくいけそうですが、メジャーなの知らないので教えてください。

けど多分ないような気がするので作ります。

宣伝:2/23に東京でiOSカンファレンスを開催します!

「conferenceWithDevelopers」というタイトルです。

公式サイト

チケットをゲットはこちらから

無料です!

豪華スピーカーでお送りしますので、みなさん是非ご参加ください!LT発表者も募集してますよ!