Где я могу указать, какой UIView используется для свойства view UIViewController? - PullRequest
0 голосов
/ 04 февраля 2011

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

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

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

Ответы [ 2 ]

1 голос
/ 04 февраля 2011

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

1 голос
/ 04 февраля 2011

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

...