2011-02-02 20 views
5

Mi sono imbattuto in qualcosa che non avevo mai visto prima e ho pensato di chiedere qui per verificare la causa. Ho un UIController la cui vista è definita in modo programmatico, ho notato oggi che quando ho commentato il codice fuori dal suo loadView (per testare qualcos'altro) che sia loadView che viewDidLoad sono stati entrambi chiamati quattro volte. Il mio pensiero è che, poiché non ho impostato la proprietà view, iOS sta provando più volte a caricare la vista, anche se sono ancora un po 'curioso se questo è il motivo per cui è stato chiamato anche viewDidLoad.loadView chiamato più volte quando la proprietà view non è stata impostata?

- (void)loadView { 
    NSLog(@"%s", __PRETTY_FUNCTION__); 

    // MAP VIEW 
    // MKMapView *tempMapView = [[MKMapView alloc] init]; 
    // [tempMapView setDelegate:self]; 
    // [self setView:tempMapView]; 
    // [self setCustomMapView:tempMapView]; 
    // [tempMapView release]; 
} 

uscita della console:

2011-02-02 14:10:00.194 Xrails[19501:307] -[MapController loadView] 
2011-02-02 14:10:00.209 Xrails[19501:307] -[MapController viewDidLoad] 

2011-02-02 14:10:00.212 Xrails[19501:307] -[MapController loadView] 
2011-02-02 14:10:00.226 Xrails[19501:307] -[MapController viewDidLoad] 

2011-02-02 14:10:00.229 Xrails[19501:307] -[MapController loadView] 
2011-02-02 14:10:00.243 Xrails[19501:307] -[MapController viewDidLoad] 

2011-02-02 14:10:00.246 Xrails[19501:307] -[MapController loadView] 
2011-02-02 14:10:00.259 Xrails[19501:307] -[MapController viewDidLoad] 
+0

Mi piacerebbe anche di legno con uso in quel loadview fare in modo che coloro che sono infatti provenienti dalla stessa MapController – nduplessis

risposta

1

Penso che ci sia due punti qui. In primo luogo, penso che la tua ipotesi sia corretta in quanto qualsiasi cosa stia richiedendo la vista è tornata indietro e quindi chiede di nuovo la vista del controller della vista. Ciò causa il passaggio attraverso -loadView come documentato per -view nello documentation for UIViewController.

Per quanto riguarda il motivo per cui -viewDidLoad viene chiamato in seguito, anche se non ha caricato la vista; Immagino che quando viene chiamato il numero -loadView, si presuma che la vista sia stata caricata e subito dopo chiama -viewDidLoad.

In entrambi i casi, se si implementa -loadView autonomamente, è necessario avere una vista valida alla fine.

2

inserire il codice in viewDidLoad, e commentare metodo loadview

+0

Quando decommento il codice funziona benissimo, ero solo curioso di sapere cosa stava succedendo. loadView sembra essere il posto giusto per creare gli elementi della vista poiché non sto usando un * .xib – fuzzygoat

+0

L'accessor della proprietà self.view chiama -loadView se la vista non è attualmente caricata. Potrebbe esserci la tua ricorsione infinita. – iHS

9

Add [super loadview] all'inizio del metodo loadview

+0

Grazie. loadView è stato chiamato 8 volte e 3 volte quando ho lasciato la vista tramite un controller di navigazione. Ora va tutto bene. – tazboy

+7

in base alla documentazione, non chiamare "[super loadView]' – user102008

+0

La documentazione dice che non si chiama loadView direttamente. Non ha detto di non chiamare super.loadView. – Boon

1

tuo forzatura dei loadView deve assegnare al fine di self.view.

- (void)loadView 
{ 
    self.view = [UIView new]; 
} 

Per documenti a https://developer.apple.com/documentation/uikit/uiviewcontroller/1621454-loadview

è possibile ignorare questo metodo al fine di creare le vostre opinioni manualmente. Se si sceglie di farlo, assegnare la vista radice della gerarchia della vista alla proprietà vista . Le viste create devono essere istanze univoche e non devono essere condivise con nessun altro oggetto del controller di visualizzazione. L'implementazione personalizzata di questo metodo non dovrebbe chiamare super.

Presumibilmente ci sono molti posti in fondo al UIKit dove qualcosa di simile viene chiamato:

if (viewController.view == nil) { 
    [viewController loadView]; 
} 
Problemi correlati