При принятии я загружаю контроллер представления из пера и решаю сделать что-то с одним из его подпредставления позади сцены. В более поздний момент вовремя, я показал бы представление этого контроллера представления.
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 метод или что-то) для этой задачи?
Прежде всего, я бы попробовал просто получить доступ к свойству:
[viewController view];
Это заставит лениво загрузить вид (и, таким образом, вложенные просмотры, выходы и т.д.), и этого может быть достаточно для вас. Контроллеры просмотра по умолчанию не будут загружать свой вид, пока вы не получите к нему доступ, так что, возможно, именно поэтому вы видите задержку.
Принудительная загрузка, как правило, является решением, когда вы пытаетесь получить доступ к свойству outlet, но на самом деле оно еще не было привязано, как someSubview
в вашем случае.
Вы также можете немного улучшить ситуацию, добавив вид, но сделав его скрытым:
viewController.view.hidden = YES;
[mainView addSubview:viewController.view];
Затем вместо вызова addSubview
, когда вы хотите его показать, просто сделайте:
viewController.view.hidden = NO;
Я использовал этот метод при анимации видов, используя UIViewAnimationTransitionFlipFromRight
и т.д. переходы. Даже при вынужденной ленивой загрузке вида все равно есть заметный лаг, поэтому я использовал этот метод для некоторого улучшения производительности.