Если вы хотите динамически выбирать вид, установите его внутри -[UIViewController loadView]
. Тем не менее, предостережение: вызов -[UIViewController view]
вызовет -[UIViewController loadView]
, если представление еще не было загружено, поэтому если вы сделаете это:
-(void)loadView
{
self.view = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
self.view.backgroundColor = [UIColor redColor];
}
Вторая строка этого метода будет вызывать -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
при вставке нового.