2009-04-19 19 views
17

Ho trascorso del tempo ad imparare come utilizzare l'SDK di iPhone. Ho letto "Beginning iPhone Development: Exploring the iPhone SDK" da copertina a copertina e non ho mai visto un esempio di più viste all'interno di un XIB.Visualizzazioni multiple all'interno di uno XIB - iPhone SDK

per illustrare quello che voglio dire, ecco un colpo di schermo di un XIB con la configurazione semplice di quello che sto facendo riferimento a:

alt text http://theopensourceu.com/wp-content/uploads/2009/04/one-xib-multiple-views.png

Immagino che ci deve essere un motivo ben preciso che non ho mai visto questo. Negli esempi di Apple e in tutte le mie letture finora, sono stati usati più XIB con una sola 'vista' (e talvolta il Navigation Controller o un controller della barra delle linguette, ecc.). Qual è la ragione di questo? Dovrei evitare più viste all'interno di un XIB? Quali sono i vantaggi o gli svantaggi di entrambi i metodi?

Grazie in anticipo

risposta

21

E 'una questione di ottimizzazione della memoria e tempi di caricamento. Se metti tutte le viste in un XIB, quando l'applicazione si avvia, deve caricare l'intero XIB in memoria e costruire tutti gli oggetti per tutti i controlli, e questo richiede una quantità di tempo non trascurabile.

Se invece si separano le viste in XIB distinti, l'app si avvierà molto più rapidamente, poiché verrà caricato solo l'XIB contenente la vista iniziale e, in un primo momento, verrà utilizzata meno memoria. Quindi, quando la vista cambia, è possibile caricare il XIB contenente la nuova vista pigramente. Ciò comporta un piccolo inconveniente quando si apre una vista per la prima volta. Se sei in realtà cercando di ottimizzare l'utilizzo della memoria, puoi anche scaricare la vista precedente quando cambi le visualizzazioni, ma non lo consiglierei, poiché questo si produrrebbe in un intoppo ogni volta che cambi visualizzazione, anziché solo la prima volta si passa a una determinata vista.

+0

Sono un po 'incerto sulla distinzione tra "vista" e XIB qui. Per esempio (vero), diciamo che devo implementare qualcosa con una vista mappa in alto, 3 pulsanti in basso e diversi controlli nel mezzo a seconda di una condizione. Quel mezzo potrebbe essere un.) Etichette, formattate in un modo particolare, o b.) Un'immagine e meno etichette, formattate in modo diverso. Il mio pensiero era di 3 visualizzazioni: una vista per gestire ciascuno di questi gruppi di controlli (mappa, controlli condizionali, pulsanti). È meglio fare 3 viste in un XIB o semplicemente mettere tutti i controlli in un'unica vista? – Danny

+0

Ovviamente non dovresti mettere * ogni * vista in un singolo XIB, ma ti ha chiesto se c'è un motivo per cui non dovresti farlo affatto. Ci sono sicuramente momenti in cui è utile. –

4

Seguendo la risposta precedente, ci sono alcune volte in cui si desidera caricare più viste contemporaneamente. Ecco un esempio: stai visualizzando un report con più pagine e userai un UIScrollView per gestirli. Quando l'utente ha finito di sfogliare il rapporto, chiuderà il rapporto che chiuderà la visualizzazione.

Creare un UIScrollView in un XIB insieme a un UIView per ogni pagina richiesta. Dal momento che le UIViews fanno parte dell'XIB, verranno caricate insieme nella memoria, tutte insieme, una volta aperto il report. Crea due UIViewControllers e usali per visualizzare la pagina visualizzata e quella che scorre verso. Mentre l'utente sposta le pagine, riutilizzare UIViewController sulla pagina da cui si scorre per mantenere aperta la pagina.

Ciò garantirà grandi prestazioni mentre l'utente sta sfogliando le pagine. Carica tutte le pagine contemporaneamente nella memoria. Io uso solo due UIViewControllers, e cambia solo quali viste sono in loro e li sposta in giro.

Questo ha anche il grande vantaggio di avere tutte le pagine in un XIB. Rende più facile la modifica e più veloce da caricare rispetto agli XIB separati. Devi solo assicurarti di avere la memoria per caricare tutte le pagine contemporaneamente. Se è contenuto statico (come nel mio caso) è un ottimo modo per andare.

Se siete alla ricerca di un buon esempio di come fare questo, ho trovato questa risorsa di essere un ottimo punto di partenza:

http://cocoawithlove.com/2009/01/multiple-virtual-pages-in-uiscrollview.html

1

Questo è un avvertimento a tutti coloro che cercando di attuare paesaggio e ritratto con due viste in un singolo XIB (iOS 4 con Xcode 4).Lo svantaggio principale di avere due viste in un singolo XIB - per me - era che si può collegare un solo oggetto UIOutlet in un XIB a un singolo oggetto UIOutlet in un controller di visualizzazione.

Quindi, ad esempio, se si dispone di un XIB con una vista per orizzontale e una vista per verticale, e entrambe le viste contengono gli stessi oggetti di interfaccia in posizioni diverse (come una UILabel in orizzontale e una UILabel in verticale). Non è possibile collegare UILabel nella vista verticale e l'oggetto UILabel nella vista orizzontale a un singolo oggetto UILabel nel controller di visualizzazione allo stesso tempo.

Trovo questa delusione, poiché la documentazione di iOS UIViewController (iOS 4.3) mi ha suggerito di implementare viste panoramiche e verticali personalizzate passando da una visualizzazione all'altra a due a livello di programmazione mentre lo schermo ruota.

Dopo aver trascorso un po 'di tempo a capire come eseguire questa operazione, ho scoperto che è possibile avere due viste diverse collegate a un singolo controller di visualizzazione, ma è necessario disporre di prese per entrambe le viste. Ad esempio, nel mio controller di visualizzazione, ho due oggetti UILabel (uno per connettersi a un UILabel nella vista verticale, uno per connettersi a un UILabel nella vista orizzontale). Nel mio codice, ogni volta che aggiorno l'uscita del paesaggio, aggiorno anche il panorama verticale.

Non molto elegante, ma funziona, e poiché questo è per una vista semplice con uno schermo, non consumerà troppa memoria per avere tutti gli oggetti UI duplicati nel controller e nelle viste. Non vorrei creare un progetto che l'abbia fatto di nuovo in quel modo, ma è stato un buon compromesso per quel progetto.