2009-12-16 7 views
6

Qual è l'approccio migliore per implementare schede che assomigliano ad applicazioni web su iPhone, come lo screenshot qui sotto (notare le schede "Checkin-Info-Friends")? Questi non fanno parte della libreria standard UIKit, ma ultimamente sembrano essere molto comuni.Schede web-like per l'iPhone

Ho trascorso molto tempo a sviluppare applicazioni per iPhone, ma non a sviluppare controlli come quello. Quale sarebbe l'approccio migliore qui:

  • creare un nuovo UIView per ogni contenuto della scheda e aggiungere subito le tre sottoview alla vista principale?
  • creare nuove visualizzazioni utente solo quando l'utente fa clic su ciascuna scheda?
  • Inserisci tutto il contenuto in un UIScrollView e modifica semplicemente la pagina mentre l'utente fa clic su ogni scheda?

Forse ci sono controlli open source per questo là fuori? Non ho trovato nulla.

alt text http://www.foursquaregame.com/foursquare-game-images/foursquare-game-mobile-app.jpg

risposta

3

mio approccio ad un problema simile è stato quello di rendere tutte le visualizzazioni scheda 4 (nel mio caso), ma rispondere alle didReceiveMemoryWarning rilasciando tutti, ma la vista scheda corrente. (Poi, ovviamente, devi assicurarti di creare la nuova vista, se non esiste, quando l'utente sceglie una nuova scheda.)

Ho pensato che questo fosse un buon compromesso - una reazione rapida al l'utente all'inizio (e nel mio caso l'impronta di memoria è al minimo in questo punto della mia app), quindi una risposta alla memoria insufficiente per evitare di essere colpito.

+0

Quindi si avrebbe un tabviewcontroller, ma 4 viste, ognuna compresa "think coffee" e le schede (dall'immagine sopra)? –

+0

Nel tuo caso, avrei 1 controller tabview, una vista base con il "think coffee" e quindi 3 schede più piccole per la parte inferiore dello schermo, una per ogni scheda. (Salvataggio della memoria se le visualizzazioni della scheda non sono a schermo intero.) –

+0

(Anche se questa decisione per me è stata semplice, perché ciascuna delle mie tabviews ha solo alcuni pulsanti - quindi è semplice utilizzare lo stesso controller di visualizzazione per tutte le visualizzazioni tab. la logica è solo un semplice metodo di azione dei pulsanti.) –

1

Penso che sia meglio avere solo tre riferimenti UIView * alle subview nella vista padre o al controller di visualizzazione, tutto inizialmente null, quindi avere subroutine per nascondere le altre due viste se sono visibili e costruiscono e mostrano o mostra solo la nuova vista. Supponendo che non ci siano requisiti di memoria straordinari.

Penso che con una piccola area dello schermo carichi/scarichi i problemi a livello di sottoview non siano probabilmente un problema, ma se le viste genitore devono essere caricate/scaricate, le sottoview dovrebbero andare tutte (essere sia nascoste che scaricate), e durante il caricamento, loadView dovrebbe chiamare la routine descritta nell'ultimo paragrafo all'avvio.

Se c'è una grande quantità di memoria o di risorse utilizzate da una delle tre sottoview, allora il mio consiglio è invertito e ciascuna delle sottoview e/o qualsiasi oggetto ad alto dispendio di memoria dietro di esse dovrebbe essere non solo nascosta ma scaricato quando è possibile. Penso che con l'uso di Google Maps lì, la necessità di scaricare quando nascosto potrebbe applicarsi a questo.

È questo il punto giusto da fare? C'è qualche dettaglio in più che mi manca?

1

Puoi avere ogni scheda un vero controller di visualizzazione con pennino e tutto. L'unico problema è che devi inoltrare le chiamate del controller di visualizzazione standard che desideri ricevere (viewWillAppear, ecc.) Ma rende la codifica molto più pulita poiché codifichi come faresti per qualsiasi altra vista (anche se per uno spazio più piccolo).

Si richiama la proprietà "vista" di ciascun controllore per ottenere la vista, che si aggiunge come sottoview di una vista contenitore che si ha sotto le schede.

1

Se tutte e tre sono viste tabella, è possibile utilizzare un singolo UITableViewController che modifica i contenuti in base alla scheda selezionata. Altrimenti, secondo il commento di KHG sull'uso dei controller di vista reali per eseguire il backup di ciascuna delle sottoview.

Per le schede stesse considerare la sottoclasse UISegmentedControl.

+0

Grazie per la risposta, Frank. Non tutti i punti di vista sono tabelle, avrei dovuto dirlo. Ottima idea su UISegmentedControl. –

+0

Ciao Frank, non sono riuscito a capire come suddividere UISegmentedControl e sostituire il metodo di disegno, per produrre le mie immagini. Avresti qualche idea su quale metodo dovrei scavalcare? –

+1

Non ho un sacco di (bene, nessuna) esperienza nella sottoclasse degli elementi dell'interfaccia utente. Potresti sovrascrivere il metodo 'drawRect', usare' [super widthForSegmentAtIndex] 'per afferrare le larghezze e' [super selectedSegmentIndex] 'per scoprire quale evidenziare. Puoi anche camminare sull'albero della sottoview e dire a qualsiasi UILabel di disegnare se stesso. Ma non sono sicuro di quanto lontano puoi andare prima di trovarti nel territorio di rifiuto dell'API non documentato. –