Заставьте представление (инициализированное из initWithNibName) загрузить все его подвид

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

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 или что-то в этом роде) для этой задачи?


person iamj4de    schedule 20.12.2009    source источник


Ответы (2)


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

[viewController view];

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

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

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

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

Затем вместо вызова addSubview, когда вы хотите его показать, просто выполните:

viewController.view.hidden = NO;

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

person Mike Weller    schedule 20.12.2009
comment
@MarkAmery Apple прямо говорит вам не вызывать -loadView в документации: вы никогда не должны вызывать этот метод напрямую. Контроллер представления вызывает этот метод, когда его свойство представления запрашивается, но в настоящее время равно нулю. Этот метод загружает или создает представление и назначает его свойству представления. - person Mike Weller; 25.06.2013
comment
@MikeWeller Хороший замечание - я недостаточно внимательно изучил документацию, чтобы понять это. Думаю, тогда нам придется выбирать между одним из двух немного уродливых приемов. Со своей стороны, я, вероятно, буду придерживаться loadView только потому, что он более ясен, но я признаю, что это не то чистое решение, как я думал. - person Mark Amery; 27.06.2013

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

я использую

if ([_myVC respondsToSelector:@selector(loadViewIfNeeded)]) {
    [_myVC loadViewIfNeeded];
} else {
    [_myVC view];
}
person JordanC    schedule 11.03.2016