24

Sto cercando di capire dalla documentazione Apple sketchy quale metodo è il posto migliore per inizializzare e aggiungere i miei controlli di visualizzazione alla vista del controllore.Aggiungo a livello di programmazione le sottoview in ViewDidAppear, ViewDidLoad, ViewWillAppear, il costruttore?

Con winforms è abbastanza semplice, poiché sono sempre inizializzati all'interno di InitializeDesigner, chiamati nel costruttore. Sto cercando di abbinare l'affidabilità di questo modello, se possibile.

Sto lavorando con UIViewControllers e UITableViewControllers all'interno di un UINavigationController la maggior parte del tempo - se questo influenza tutto.

Ecco un esempio:

public MyController() 
{ 
    // Here? 
    AddViews(); 
} 

public override ViewDidLoad() 
{ 
    base.ViewDidLoad(); 

    // Or is should it be here? 
    AddViews(); 
} 

public override ViewWillAppear(bool) 
{ 
    base.ViewWillAppear(animated); 

    // Here? 
    AddViews(); 
} 

public override ViewDidAppear(bool animated) 
{ 
    base.ViewDidLoad(animated); 

    // Or maybe here? 
    AddViews(); 
} 

void AddViews() 
{ 
    UILabel label = new UILabel(); 
    label.Text = "Test"; 
    label.Frame = new RectangleF(100,100,100,26); 
    View.AddSubView(label); 

    UIWebView webview = new UIWebView(); 
    webview .Frame = new RectangleF(100,100,100,26); 
    View.AddSubView(webview); 
} 

ottengo risultati contrastanti con alcuni UIControls quando li aggiungo alla vista in luoghi diversi. Visual lag a volte, altre volte la webview è nascosta da qualche parte.

C'è una regola generale da rispettare per aggiungerli?

+2

Vedere anche: http://stackoverflow.com/questions/573958/iphone-sdk-what-is-the-difference-between-loadview-and-viewdidload –

risposta

70

In generale, questo è quello che faccio:

  • viewDidLoad - Ogni volta che sono l'aggiunta di controlli a una visione che dovrebbe apparire insieme alla vista, subito, l'ho messo in viewDidLoad metodo. Fondamentalmente questo metodo viene chiamato ogni volta che la vista è stata caricata in memoria. Ad esempio, se la mia vista è un modulo con 3 etichette, aggiungerei le etichette qui; la vista non potrà mai esistere senza quelle forme.

  • ViewWillAppear: Uso ViewWillAppear in genere solo per aggiornare i dati nel modulo. Quindi, per l'esempio sopra, vorrei usarlo per caricare effettivamente i dati dal mio dominio nel modulo. La creazione di UIViews è piuttosto costosa, e dovresti evitare il più possibile di farlo con il metodo ViewWillAppear, perché quando viene chiamato, significa che l'iPhone è già pronto per mostrare l'UIView all'utente, e qualsiasi cosa pesante fai qui influenzerà le prestazioni in modo molto visibile (come le animazioni in ritardo, ecc.).

  • viewDidAppear: Infine, io uso il viewDidAppear per iniziare nuove discussioni a cose che sarebbe voluto molto tempo per l'esecuzione, come ad esempio fare una chiamata webservice per ottenere dati aggiuntivi per il modulo qui sopra.La cosa buona è che poiché la vista esiste già e viene visualizzata all'utente, puoi visualizzare un messaggio "In attesa" per l'utente mentre ottieni i dati.

Esistono altri trucchi che è possibile utilizzare. Diciamo che vuoi che un UILabel "voli" nel modulo dopo che il modulo è stato caricato. In tal caso, aggiungerei l'etichetta al modulo in ViewDidLoad ma con una cornice all'esterno dell'area di visualizzazione, quindi nel ViewDidAppear farei l'animazione per riportarla in vista.

Spero che aiuti.

+0

Grazie che è chiarito molto. Non sono stato in grado di aggiungere nulla con l'esempio LoadView da questa domanda: http://stackoverflow.com/questions/573958/iphone-sdk-what-is-the-difference-between-loadview-and-viewdidload - do hai mai usato questo metodo? –

+1

Quindi fondamentalmente loadView è un metodo di UIViewController (Usa la rosetta quando stai cercando di capire queste cose - http://tirania.org/tmp/rosetta.html). Il framework chiama automaticamente questo metodo nel controller per dirgli di creare viste e l'implementazione predefinita di UIViewController chiama quindi ViewDidLoad. Sebbene tu possa ignorare questo metodo (e assicurarti di chiamare il metodo base quando lo fai), personalmente, preferisco semplicemente usare viewWillLoad (chiamato prima di loadView) e viewDidLoad (chiamato subito dopo). –

+0

@eduardo, i documenti consigliano di non chiamare super su loadView –

8

Hmm, i documenti di Apple sembrano essere abbastanza chiari, IMHO.

Se si crea il proprio punto di vista di root (la vista radice della gerarchia della vista questo particolare del controller) a livello di codice, è necessario creare in -loadView senza chiamare super e impostare la proprietà view quando fatto. Se la tua vista è caricata da un pennino, non toccare -loadView.

È possibile aggiungere sottoview personalizzate alla vista del controller della vista o modificarla in altro modo in -viewDidLoad. Lo studio consigliato consiste nel creare UILabel e UIWebView in -viewDidLoad e rilasciarli in -viewDidUnload, impostando i loro riferimenti su nil se è necessario conservarli in ivars.

Nota: -viewDidUnload è obsoleto in iOS 6 e non è più chiamato, perché UIViewController non espelle più la sua vista sotto pressione di memoria.

+0

Grazie ho perso quel metodo. Tuttavia, sento ancora i metodi che ho elencato dare informazioni molto limitate su quando usarli. Anche in loadView tutto quello che ti viene detto è * 'Se vuoi eseguire un'ulteriore inizializzazione delle tue viste, fallo nel metodo viewDidLoad' * - quando avresti mai bisogno di questo metodo? –

+0

loadView è il metodo che carica la gerarchia di visualizzazione da NIB o crea semplicemente un UIView vuoto se non viene caricato alcun NIB. Puoi preferire una vista personalizzata al posto di essa, nel qual caso sostituisci loadView. Ad esempio, UITableViewController sostituisce questo metodo per creare un UITableView. Spesso mi trovo a fare la stessa cosa con le mie sottoclassi UIView. – Costique

+0

viewDidUnload è deprecato –

2

viewDidLoad fa riferimento a "MEMORIA" e viewWillAppear/viewDidAppear si riferisce a "ASPETTO". La vista di un controller di visualizzazione (che è una vista di radice delle viste del controller di visualizzazione) può apparire/scomparire numerose volte, anche se la vista del controller è già in memoria.

(Quando si fa riferimento alla vista radice, intendo anche le sue sottoview, perché la vista radice ha riferimento ai suoi figli (sottoview), ma dal punto di vista di un controller di visualizzazione, di solito conosce solo la vista radice. le visualizzazioni secondarie possono normalmente avvenire tramite i punti di controllo del visualizzatore.)

La vista radice stessa può essere rimossa dalla memoria quando è presente un avviso di memoria. Il controller della vista determinerà quando è il momento migliore per rimuoverli dalla memoria.

Quindi, si dovrebbero aggiungere le visualizzazioni secondarie in viewDidLoad, perché l'aggiunta di sottoview significa aggiungerle alla memoria. MA non se crei tutte le tue viste a livello di codice (non da un pennino). In tal caso, è necessario sovrascrivere il metodo loadView e creare una vista radice e aggiungere le visualizzazioni secondarie, quindi in questo caso è possibile omettere viewDidLoad per aggiungere le visualizzazioni secondarie.

Problemi correlati