2009-12-20 10 views
9

Supponendo che carico un controller di visualizzazione da un pennino e decido di fare qualcosa con una delle sue sottoview dietro la scena. In un secondo momento, mostrerò la vista di questo controller di visualizzazione.Crea una vista (inizializzata da initWithNibName) carica tutta la sua sottoview

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

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

Il problema è che, l'oggetto someSubview non sembra essere caricato fino a visualizzare la vista, in modo che il metodo doSomething non viene chiamato. Finora la mia soluzione alternativa è chiamare:

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

per inizializzare prima le sottoview di viewcontroller. C'è un modo più elegante (come un metodo loadSubviews o qualcosa del genere) per questo compito?

risposta

23

Prima di tutto vorrei provare semplicemente accedendo alla proprietà:

[viewController view]; 

questo costringerà il carico pigro della vista (e quindi i subviews e punti vendita, ecc) e questo potrebbe essere abbastanza per voi. Per impostazione predefinita, i controller di vista non caricheranno la loro vista fino a quando non accederai così questo potrebbe essere il motivo per cui stai vedendo un ritardo.

Forzare un carico come questo è in genere la soluzione quando si sta tentando di accedere a una proprietà di uscita ma non è stato ancora associato, come nel caso someSubview.

È inoltre possibile migliorare le cose un po 'con l'aggiunta di vista, ma che lo rende nascosto:

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

Poi invece di chiamare addSubview quando si vuole mostrare, basta fare:

viewController.view.hidden = NO; 

I Ho usato questo metodo durante l'animazione nelle viste usando le transizioni UIViewAnimationTransitionFlipFromRight ecc. Anche quando costruisco un carico pigro della vista c'è ancora un ritardo notevole, quindi l'ho usato per migliorare un po 'le prestazioni.

+0

Grazie, che ha fatto. – iamj4de

+0

@MarkAmery Apple ti dice esplicitamente di non chiamare -loadView nella documentazione: "Non dovresti mai chiamare direttamente questo metodo.Il controller di visualizzazione chiama questo metodo quando la sua proprietà view è richiesta ma è attualmente nul. Questo metodo carica o crea una vista e lo assegna alla proprietà vista. " –

+0

@MikeWeller Un buon punto: non avevo letto abbastanza attentamente la documentazione per saperlo. Suppongo che dobbiamo scegliere tra uno dei due hack leggermente brutti, quindi. Da parte mia, probabilmente userò 'loadView' solo perché è più esplicito, ma ammetto che non è la soluzione pulita che pensavo fosse. –

0

iOS 9 introdotto -(void) loadViewIfNeeded

Io uso

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