2011-02-04 1 views
0

Я хочу установить свойство представления UIViewController во время выполнения. У меня есть .xib-файл с двумя представлениями, и я хочу, чтобы мой подкласс UIViewController имел файл .xib, чтобы решить, какой UIView использовать во время выполнения. Я думал, что могу сделать это в loadView, просто сказав:Где я могу указать, какой UIView используется для свойства view UIViewController?

if(some condition) 
    self.view = thisView; 
else 
    self.view = thatView; 

но это не сработало. Как я могу это сделать?

ответ

1

Если вы хотите, чтобы выбрать вид динамически установить его внутри -[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 при вставке новенький.

+0

Я должен был упомянуть, оба представления являются частью xib-файла контроллера вида как IBOutlets. Разве это не нормально? иначе я сделал точно так же, как и у вас. – Marty

+0

Я обновил ответ, чтобы показать лучший подход, если вы хотите выбрать один из нескольких видов из XIB-файла View Controller. –

+0

+1 для добавления – Anurag

0

Внутри -(void)loadView; метод, где вы создаете ваш взгляд, так что есть, где вы хотите установить его условно;)