2011-09-11 11 views
5

Desidero configurare un UIViewController all'interno di NavigationController a livello di codice, tuttavia viene richiamato il metodo loadView o viewDidLoad.loadView di UIViewController non chiamato

Questo è il mio codice nel delegato app:

MyViewController *viewController = [[MyViewController alloc] init]; 
UIView *view = [[UIView alloc] initWithFrame:window.frame]; 
viewController.view = view; 

UINavgationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController]; 

[window addSubview:[navController view]; 
[window makeKeyAndVisible]; 

Quando avvio l'applicazione vedo un navigationbar, ma non le chiamate a loadview. Cosa mi manca? ho pensato loadview viene chiamato dopo aver chiamato view

Modifica

MyViewController *viewController = [[MyViewController alloc] init]; 
[viewController view]; // doesn't look right? 

UINavgationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController]; 

[window addSubview:[navController view]; 
[window makeKeyAndVisible]; 

cura verso il commento di Giona, ma loadview ancora non viene chiamato.

risposta

10

Un UIViewController creerà la sua vista (scaricandole da un pennino o implementando -loadView) quando view getter del controller è chiamato e il punto di vista è attualmente nil.

Nel codice visualizzato non si invoca mai il getter della proprietà della vista, ma solo il suo setter.

Inoltre, si assegna la vista del controller dal proprio delegato dell'app. Si prevede che i UIViewController s creino le proprie viste su richiesta, non che siano fornite da qualche altra classe. Questo approccio causerà problemi in seguito quando ci si accorge che il controllore scarica la vista e tenta di ricrearlo in risposta agli avvisi di memoria. Lascia che il tuo controller crei la sua vista, non provare a passarne una.

+0

Per quanto riguarda la seconda osservazione, assegnando la vista, intendi la mia seconda e terza riga di codice, giusto? Ciò ha senso. Ma come chiamerei il getter in questo caso? –

+0

'[viewController view]' richiama il getter della vista ma non dovrebbe esservi bisogno di farlo direttamente. Il 'UINavigationController' che hai aggiunto il tuo controller di visualizzazione chiamerà quel getter ad un certo punto per aggiungere la vista del controller alla gerarchia della vista. Puoi condividere l'implementazione del tuo controller di visualizzazione? Sembra che tu abbia qualcos'altro da fare. – Jonah

+0

In pratica è il modello UIViewController vuoto di Xcode, ma nessun metodo (vista) viene chiamato oltre a init. Ci ho provato ad impostare una vista come questa: - (id) init { \t self ((self = [super init]) { \t UIView * view = [[UIView alloc] initWithFrame: [[UIScreen mainScreen] bounds] ]; \t self.view = view; \t [visualizza versione]; \t} ritorno self; } –

2

forse non dovevi affrontare questo problema ... ma l'altro giorno mi sono imbattuto nello stesso fastidioso problema .. loadView, viewDidLoad e viewWillAppear non vengono chiamati nel mio UIViewController.

Il mio problema era v. Semplice ma un po 'difficile da prendere se non si è molto attenti. Invece di scrivere

-(void) loadView 

ho scritto:

-(void) loadview 

Si prega di notare che questo non scatterà alcun preavviso. La differenza tra "V" e "v" in loadView può facilmente essere persa. E ovviamente, dal momento che loadView non è stato chiamato, viewDidLoad/viewWillAppear non verrà richiamato perché non c'è nessuna vista caricata (non sto usando alcun pennino ... creando la vista a livello di programmazione).

-Anshu

2

Un altro punto degno di nota è che se si definisce un

@synthesize view; 

senza @property corrispondenza nell'implementazione, questo può provocare le chiamate a zero il ritorno del controller della vista, e nessuna chiamata al tuo metodo loadView.

+1

Aha! Questo mi ha preso. Ho finito con una "@synthesize view" in una classe a causa di un'operazione di ricerca/sostituzione troppo zelante, non ce ne siamo accorti, e all'improvviso la mia vista era completamente vuota perché loadView non veniva mai più chiamato. Questo è stato difficile da rintracciare. Grazie! –

Problemi correlati