UIViewController の init の中で self.view を参照しない方がいい

June 27, 2010

Xibファイルを使わずコードで書いてビューの生成を生成したいとき、ViewController の init メソッドの中で子ビューの初期化を下記の場所でしたくなるが、この時点ではベースとなる View 自体が生成されていないので、self.view を参照した時点でこの ViewController が実装する loadView, viewDidLoad が呼ばれてしまう。

- (id)init {
if (self = [super init]) {
// ここで子ビューの初期化
// self.view を参照してはいけない
}
}

たとえば、下記のようなコードだと(1),(2),(3)の順に実行されてしまう。

- (id)init {
if (self = [super init]) {
CGRect rect = self.view.bounds; //(1)
UIView *subview = [[UIView alloc] initWithFrame:rect]; //(3)

}
}
- (void)loadView {
//(2)
}

子ビューの生成は loadView で全て行うか、init では alloc, init にとどめ、位置、サイズかかわる設定は loadView 以降で行うこと。

サイズなどを決めうちで実装していて、上記の動作には気がついていなかった。
ということで初 iPhone SDK がらみのエントリーでした。

tilfin freelance software engineer