2010-03-02 13 views
20

Ho seguente problema:iPhone: come passare i dati tra diversi Viewcontrollers in un Tabbar App

Ho creato un'applicazione TabBar con 4 schede. Voglio passare un oggetto/variabile dal primo controller della scheda al terzo e inizializzare questo controller con l'oggetto corrispondente.

Ho già fatto qualche ricerca. Il modo migliore, che corrisponde a un approccio basato su un modello pulito, consiste nel chiamare un metodo initWithObject: sul viewcontroller chiamato. Come posso ottenere questo? Come posso chiamare il metodo init del controller di ricezione all'interno del callercontroller? Puoi darmi qualche esempio di codice?

Modifica: Per passare i dati tra più viste/classi, ecc. Creare semplicemente una sorta di classe di dati che contiene i dati condivisi tra più classi. Per ulteriori informazioni seguire il link: Singleton

risposta

28

È necessario un oggetto modello dati che memorizzi i dati per l'applicazione.

Un modello dati è un oggetto standalone personalizzato accessibile da qualsiasi punto dell'applicazione. L'oggetto del modello di dati non conosce nulla sulle viste o sui controller di vista. Memorizza solo i dati e le relazioni logiche tra i dati.

Quando diverse parti dell'app devono scrivere o leggere dati, scrivono e leggono sul modello dati. Nel tuo caso, view1 salverà i suoi dati nel modello dati quando scaricherà e quindi view2 leggerà i dati dal modello dati quando carica (o viceversa.)

In un'app progettata correttamente, non ci sono due controller di vista dovrebbe avere accesso ai dati interni di un altro controllore. (L'unica ragione per cui i controller di vista devono sapere dell'esistenza di un altro controller è se deve attivare il caricamento di quell'altro controller.)

Il modo più rapido e sporco per creare un modello di dati è quello di aggiungere attributi al delegato app e quindi chiamare il delegato app dal controller di vista utilizzando:

YourAppDelegateClass *appDelegate = [[UIApplication sharedApplication] delegate]; 
myLocalProperty = appDelegate.someDataModelProperty; 

Questo lavoro per progetto di piccole dimensioni, ma come i tuoi dati diventano complessi, dovresti creare una classe dedicata per il tuo modello di dati.

Edit:

Per chiarire per il vostro caso specifico, si dovrebbe aggiungere la chiamata al modello di dati quando il ricevitore viewController diventa attivo.

L'inserimento dei dati in un metodo init o viewDidLoad non funziona perché in un UITabBar gli utenti possono passare avanti e indietro senza scaricare la vista o reinizializzare il controller di visualizzazione.

Il luogo migliore per recuperare i dati modificati è nel metodo del controller viewWillAppear. In questo modo i dati verranno aggiornati ogni volta che l'utente passa a quella scheda.

+1

Grazie mille. Io uso ora l'approccio singleton. Ho anche pubblicato alcuni link a un buon tutorial che descrive, quali passaggi devono essere fatti per creare un modello di dati singleton. –

4

Si potrebbe prendere in considerazione NSNotificationCenter (Reference); si registra un viewcontroller con il centro notifiche dell'applicazione e si invia una notifica quando viene effettuata una selezione. Una volta ricevuta la notifica, l'altro controllore di vista si aggiorna di conseguenza.

+0

Questo è vero, ma penso che non è possibile passare oggetti tramite NSNotificationCenter. Quindi potrei inviare alcune notifiche al ricevitoreController. Ma poi ho ancora il problema che ho bisogno dei miei parametri di init per avviare il nuovo viewcontroller. –

+4

Ti sbaglieresti. Puoi perfettamente passare oggetti tramite 'NSNotificationCenter'. Puoi usare, per esempio; '- (void) postNotificationName: (NSString *) notificationName object: (id) notificationSender userInfo: (NSDictionary *) userInfo', o solo' + (id) notificationWithName: (NSString *) aName object: (id) anObject' –

0

Non credo che questa è la migliore prassi (controllare anche la sintassi) però ho fatta franca:

nel .h

otherclassref *otherclassname 

@property (assign) otherclassname otherclassref; 

e nel .m

@synthesize otherclassref; 

quindi ho appena assegnato il riferimento da qualche parte conveniente ad es. l'app delegata o ovunque tu stia istanziando i tuoi viewcontrollers.

quindi il controller della vista può ottenere un riferimento all'altro controller della vista.

Aggiungo @class secondviewcontroller al file .h per il primoviewcontroller e inserisco #imports "secondviewcontroller.h" nel file .m del primo controller di visualizzazione. Questi sono chiamati riferimenti in avanti e impediscono errori del compilatore risultanti dall'avere file .h che si riferiscono l'un l'altro.

+0

Questo funzionerà ma non è una buona pratica, perché la complessità dei riferimenti tra i controller della vista aumenterà a mano a mano che si aggiungono viste. Aggiungere o rimuovere un controller di visualizzazione significa aggiornarne molti altri. Un controller di visualizzazione può manipolare i dati contenuti in un altro. – TechZen

+0

@TechZen mi sembra ragionevole – PeanutPower

Problemi correlati