備忘録 〜プログラミング〜

プログラミングに関する事をつらつらと、、

UIViewControllerのloadViewメソッド

UIViewControllerにカスタムビューをセットするときは、いつも以下のようにviewDidLoadでセットしていたのですが、loadViewというメソッドがあるという事に気付いて調べてみました。

-(void)viewDidLoad
{
  [super viewDidLoad];
  UIView *customView = [[UIView alloc] iniaWithFrame:self.view.frame];
  [self setView:customView];
}

・loadViewが呼び出されるタイミングは、viewDidLoadの前
・loadViewのタイミングでviewを調べてもnil
・viewDidLoadのときにはviewが生成されている

上記の事から、viewをセットするときにはloadViewを使うほうがいいのかなと。
あと、[super loadView]は呼ぶべきなのかどうかも曖昧だったのでappleの公式ドキュメントを読んだのですが、カスタムビューを使用するときには呼ぶべきではないとの事でした。
こんな感じの実装

- (void)loadView
{
  UIView *customView = [[UIView alloc] init];
  [self.setView:customView];
}

ただし、UIViewControllerのviewにカスタムビューをセットしない場合は[super loadView]を呼ばないと、UIViewControllerのviewが生成されていないためにエラーになります。
これとか

- (void)loadView
{
  UIView *view = [[UIView alloc] init];
  [self.view addSubview:view];
}

以下、注意点です。
・Interface Builderを使用する場合は、loadViewはオーバーライドしてはいけない
・loadViewをオーバーライドする場合は必ずself.viewへの設定をするか[super loadView]を呼ぶこと。呼ばずにviewDidLoad内で、self.viewを参照すると無限ループに陥る
・loadViewをオーバーライドすると、nibファイルの読み込みは行われない

しっかり公式ドキュメントは読まないといけないなと感じました、、


UIViewController Class Reference