2010-07-02 10 views

risposta

0

No, il messaggio viewDidLoad viene sempre chiamato dopo init.

Sei sicuro che init venga chiamato? Esistono diversi metodi di init, in particolare per UIViewController, forse viene chiamato un altro, che ti fa pensare in modo diverso.

Se hai bisogno di ulteriori informazioni, ti preghiamo di incollare il codice di viewDidLoad e tutti i tuoi metodi di init e dirci come viene caricato (cioè con il codice) o da un pennino.

+1

Sì, init sta chiamando ma dopo viewDidLoad. Per quel particolare UIViewController basta allocare e init. e impostando quel controller su un UITabBarController come controller di visualizzazione e presentando il tabbarController? C'è qualcosa di sbagliato qui? –

+0

Init viene eseguito prima di viewDidLoad, a meno che non si sia incasinato davvero male, il che è molto improbabile. Ti manca un altro init o trarre conclusioni sbagliate. Cosa ti fa pensare che init sia chiamato dopo viewDidLoad? E hai controllato che questo è lo stesso oggetto? Di nuovo, nessun codice - nessun modo per controllare. – Eiko

0

Se il ViewController viene caricato dal file di pennino principale, molto probabilmente è initWithCoder che viene chiamato per inizializzare il controller.

3

Quando si inizializza un codice UIViewController, si utilizza -initWithNibName:bundle:, mentre quando viene inizializzato da un XIB, il codice di caricamento XIB chiamerà -initWithCoder:. Uno, e solo uno di questi due metodi verrà chiamato e verrà chiamato prima dello -viewDidLoad.

Non esiste un modo plausibile per chiamare -viewDidLoad, a meno che non lo si chiami tu stesso (cosa che non dovresti mai fare).

11

So che questo post è un po 'vecchio, ma posterò il mio punto di vista ovunque perché penso che potrebbe aiutare qualcuno.

Bene, sono stato in questa stessa situazione. Ho pensato che viewDidLoad fosse chiamato prima del metodo init nella mia classe di controller di visualizzazione. Ma quello che stava realmente accadendo non era quello: il flusso inizia con il metodo init, ma salta a viewDidLoad quando chiama [super init *], quindi i miei messaggi di log nel metodo viewDidLoad venivano visualizzati per primi rispetto a quelli della mia inizializzazione personalizzata.

Penso sia così. Spero che questo per risparmiare tempo a qualcuno.

[dispiace per il mio inglese]

+0

Grande osservazione! –

34

Il metodo viewDidLoad viene chiamato quando si accede self.view all'interno del metodo init (dal self.view non dovrebbe ancora essere caricate dal pennino il processo sembra essere il fissaggio in modo che non ritorna nil).

+4

Quindi grazie. self.view in init era il mio enorme problema. –

+1

Grazie, spostato qualsiasi attività self.view per viewDidLoad e cambiato tutte le proprietà che avevo bisogno nel mio inizializzatore designato da self.property a _property. Risolto tutto. – Jonauz

+0

In ritardo commento, mi sono imbattuto in questo stesso problema, ma sono confuso come? Ignora semplicemente il costruttore? –

3

Non so che tipo di viewController ha causato questo per voi, ma ho affrontato un caso simile con UITabBarController. Ho pensato che potrebbe aiutare un altro che lo affronta con UITabBarController.
Poiché so che viewControllers chiama init prima di viewDidLoad, tranne UITabBarController e le sue sottoclassi.
Come afferma Andrew here, UITabBarControllers chiama loadView all'interno del metodo [super init], che causa la chiamata a viewDidLoad. Quindi il metodo viewDidLoad verrà chiamato prima che init abbia finito.
Se hai qualche cosa da configurare in viewDidLoad forse dovresti farlo all'interno del metodo init dopo la chiamata a [super init].

Problemi correlati