2009-12-20 2 views
9

En supposant que je charge un contrôleur de vue à partir d'une plume, et décide de faire quelque chose avec une de ses sous-vue derrière la scène. Plus tard dans le temps, je montrerais la vue de ce contrôleur de vue.Créer une vue (initialisée à partir de initWithNibName) charger toute sa sous-vue

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

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

Le problème est que, l'objet someSubview ne semble pas être chargé jusqu'à ce que la vue apparaît, la méthode doSomething est pas appelé. Jusqu'à présent, ma solution de contournement consiste à appeler:

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

pour initialiser les sous-vues de viewcontroller en premier. Existe-t-il un moyen plus élégant (comme une méthode loadSubviews ou quelque chose) pour cette tâche?

Répondre

23

tout d'abord j'essayer d'accéder simplement la propriété:

[viewController view]; 

Cela forcera la charge paresseuse de la vue (et donc les sous-vues et points de vente, etc.) et cela pourrait être suffisant pour vous. Les contrôleurs View par défaut ne chargeront pas leur vue tant que vous n'y accéderez pas, cela pourrait expliquer pourquoi vous voyez un retard.

Forcer une charge comme celle-ci est généralement la solution lorsque vous essayez d'accéder à une propriété de sortie, mais elle n'a pas encore été liée, comme someSubview dans votre cas.

Vous pouvez également améliorer les choses un peu en ajoutant le point de vue, mais ce qui en fait caché:

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

Ensuite, au lieu d'appeler addSubview quand vous voulez le montrer, il suffit de faire:

viewController.view.hidden = NO; 

I J'ai utilisé cette méthode lors de l'animation dans les vues en utilisant les transitions UIViewAnimationTransitionFlipFromRight etc. Même en forçant une charge paresseuse de la vue il y a toujours un retard notable, donc j'ai utilisé ceci pour améliorer la performance un peu.

+0

Merci, qui l'a fait. – iamj4de

+0

@MarkAmery Apple vous dit explicitement de ne pas appeler -loadView dans la documentation: "Vous ne devez jamais appeler cette méthode directement.Le contrôleur de vue appelle cette méthode lorsque sa propriété view est demandée mais est actuellement nulle Cette méthode charge ou crée une vue et l'affecte à la propriété view. " –

+0

@MikeWeller Bon point - je n'avais pas assez regardé la documentation pour le savoir. Je suppose que nous devons choisir entre un des deux hacks un peu moche, alors. Pour ma part, je vais probablement m'en tenir à 'loadView' juste parce que c'est plus explicite, mais je concède que ce n'est pas la solution propre que je pensais que c'était. –

0

iOS 9 introduit -(void) loadViewIfNeeded

J'utilise

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