ビューを動的に選択する場合は、 内に設定します-[UIViewController loadView]。ただし、ビューがまだロードされていない場合、呼び出し-[UIViewController view]は呼び出されるため、次のようにすると次のようになります。-[UIViewController loadView]
-(void)loadView
{
self.view = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
self.view.backgroundColor = [UIColor redColor];
}
そのメソッドの 2 行目で が呼び出さ-loadViewれ、無限再帰が発生します (スタック オーバーフローとクラッシュが発生します)。.view次のように、ビューを設定し、設定したらプロパティを設定する必要があります。
-(void)loadView
{
UIView *newView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
newView.backgroundColor = [UIColor redColor];
self.view = newView;
}
したがって、おそらく次のようなことをしたいと思うでしょう:
-(void)loadView
{
UIView *newView = nil;
if (self.theSkyIsBlue) {
newView = [[[BlueSkyView alloc] initWithFrame:CGRectZero] autorelease];
newView.backgroundColor = [UIColor blueColor];
}
else {
newView = [[[GraySkyView alloc] initWithFrame:CGRectZero] autorelease];
newView.backgroundColor = [UIColor grayColor];
}
self.view = newView;
}
補遺 1 - XIB で定義されたさまざまなビューにコンテナー ビューを使用する方法を示す更新
XIB で他のものを参照したい場合は、.view を他のビューの「コンテナー ビュー」として使用することをお勧めします。次のように で設定し-viewDidLoadます。
- (void)viewDidLoad
{
UIView *childView = nil;
if (someCondition) {
childView = self.blueView;
}
else {
childView = self.grayView;
}
[self.view addSubview:childView];
childView.frame = self.view.bounds;
}
childView後でビューを交換する場合は、ローカル変数の代わりにプロパティを作成する必要があることに注意してください。これchildViewにより、新しいビューを挿入するときに古いものを削除できます。