2009-12-20 4 views
9

Angenommen, ich laden einen View-Controller von einer Feder, und beschließen, etwas mit einer seiner Unteransicht hinter der Szene zu tun. Zu einem späteren Zeitpunkt würde ich die Ansicht dieses View-Controllers zeigen.Machen Sie eine Ansicht (initialisiert von initWithNibName) Laden Sie alle ihre Unteransicht

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

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

Das Problem besteht darin, dass das someSubview Objekt nicht geladen zu sein scheint, bis die Ansicht angezeigt wird, so dass die Methode doSomething wird nicht aufgerufen. Bis jetzt ist mein Workaround:

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

initialisieren die Subviews von Viewcontroller zuerst. Gibt es einen eleganteren Weg (wie eine loadSubviews-Methode oder etwas) für diese Aufgabe?

Antwort

23

Zunächst einmal würde ich versuchen, einfach die Eigenschaft zugreifen:

[viewController view]; 

Dies wird die träge Last der Ansicht Kraft (und damit die Subviews und Auslässe etc.) und dies könnte für Sie genug sein. Wenn Sie die Controller standardmäßig anzeigen, wird ihre Ansicht erst geladen, wenn Sie darauf zugreifen. Aus diesem Grund sehen Sie möglicherweise eine Verzögerung.

Das Erzwingen einer solchen Last ist normalerweise die Lösung, wenn Sie versuchen, auf eine Outlet-Eigenschaft zuzugreifen, aber in Ihrem Fall ist sie noch nicht gebunden, wie someSubview.

Sie auch, indem Sie die Ansicht die Dinge ein wenig verbessern, aber es versteckt zu machen:

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

dann statt Aufruf addSubview, wenn Sie es zeigen wollen, tun gerade:

viewController.view.hidden = NO; 

I habe diese Methode beim Animieren in Ansichten mit den UIViewAnimationTransitionFlipFromRight usw. Übergängen verwendet. Selbst wenn man eine Lazy Load der Ansicht erzwingt, gibt es immer noch eine merkliche Verzögerung, also habe ich das verwendet, um die Leistung ein wenig zu verbessern.

+0

Danke, das es tat. – iamj4de

+0

@MarkAmery Apple weist Sie explizit an, in der Dokumentation nicht -loadView aufzurufen: "Sie sollten diese Methode nie direkt aufrufen. Der View-Controller ruft diese Methode auf, wenn seine View-Eigenschaft angefordert wird, aber aktuell Null ist. Diese Methode lädt oder erstellt eine View und weist es der View-Eigenschaft zu. " –

+0

@MikeWeller Guter Punkt - ich hatte die Dokumentation nicht genau genug angesehen, um das zu wissen. Ich denke, wir müssen uns dann zwischen zwei leicht hässlichen Hacks entscheiden. Für meinen Teil werde ich wahrscheinlich bei 'loadView' bleiben, nur weil es expliziter ist, aber ich gebe zu, dass es nicht die saubere Lösung ist, die ich dachte. –

0

iOS 9 eingeführt -(void) loadViewIfNeeded

Ich benutze

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