Сделать представление (инициализированное из initWithNibName) загрузить все его подпредставления - PullRequest
9 голосов
/ 20 декабря 2009

Предполагается, что я загружаю контроллер представления из кончика и решаю что-то сделать с одним из его подпредставлений за сценой. Позже я покажу вид этого контроллера.

viewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
[viewController.someSubview doSomething];

//later on 
[mainView addSubview:viewController.view];

Проблема в том, что объект someSubview, кажется, не загружается, пока не появится представление, поэтому метод doSomething не вызывается. Пока что мой обходной путь должен позвонить:

[mainView addSubview:viewController.view];
[viewController.view removeFromSuperview];

чтобы сначала инициализировать подпредставления viewcontroller. Есть ли более элегантный способ (например, метод loadSubviews или что-то еще) для этой задачи?

Ответы [ 2 ]

23 голосов
/ 20 декабря 2009

Прежде всего, я бы попробовал получить доступ к свойству:

[viewController view];

Это приведет к ленивой загрузке представления (и, следовательно, подпредставлений, выходов и т. Д.), И этого может быть достаточно для вас. Контроллеры представлений по умолчанию не будут загружать их, пока вы не получите к ним доступ, поэтому, возможно, именно поэтому вы видите задержку.

Принудительная загрузка, подобная этой, обычно является решением, когда вы пытаетесь получить доступ к свойству розетки, но оно еще не было привязано, как someSubview в вашем случае.

Вы также можете немного улучшить ситуацию, добавив представление, но сделав его скрытым:

viewController.view.hidden = YES;
[mainView addSubview:viewController.view];

Тогда вместо того, чтобы звонить addSubview, когда вы хотите показать это, просто сделайте:

viewController.view.hidden = NO;

Я использовал этот метод при анимации в представлениях с использованием переходов UIViewAnimationTransitionFlipFromRight и т. Д. Даже при принудительной загрузке вида по-прежнему наблюдается заметная задержка, поэтому я использовал это, чтобы немного улучшить производительность.

0 голосов
/ 11 марта 2016

iOS 9 представлена ​​-(void) loadViewIfNeeded

Я использую

if ([_myVC respondsToSelector:@selector(loadViewIfNeeded)]) {
    [_myVC loadViewIfNeeded];
} else {
    [_myVC view];
}
...