Riferimento alle variabili di istanza di AppDelegate


84

Ho un progetto basato sul modello di applicazione basata sulla navigazione. Nell'AppDelegate ci sono i metodi -applicationDidFinishLoading:e -applicationWillTerminate:. In questi metodi, sto caricando e salvando i dati dell'applicazione e archiviandoli in una variabile di istanza (in realtà è un oggetto-grafico).

Quando l'applicazione viene caricata, carica MainWindow.xib, che ha un NavigationConroller, che a sua volta ha un RootViewController. La nibNameproprietà RootViewController punta a RootView (la mia classe controller effettiva).

Nella mia classe, desidero fare riferimento all'oggetto che ho creato nel -applicationDidFinishLoading:metodo, in modo da poter ottenere un riferimento ad esso.

Qualcuno può dirmi come farlo? So come fare riferimento tra oggetti che ho creato a livello di codice, ma non riesco a capire come tornare indietro, dato che il passaggio intermedio è stato eseguito all'interno del file NIB.

Risposte:


204

Per le variabili (di solito la struttura dei dati del modello) a cui ho bisogno per accedervi ovunque nell'app, dichiarale nella tua classe AppDelegate. Quando è necessario farvi riferimento:

YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate];
//and then access the variable by appDelegate.variable 

7
Ho votato questo perché hai aggiunto il cast, devi trasmettere AppDelegate al tuo tipo in modo da poter vedere le tue proprietà che hai impostato. Potresti modificare per renderlo più chiaro non
trasmettendo

Esiste un modo per accedere al controller di visualizzazione radice senza fare riferimento al nome del delegato dell'app o a uno dei suoi membri? (Vorrei scrivere del codice portatile che necessita del controller di visualizzazione root.)
SK9

SK9, ogni app iOS deve avere un appDelegate, quindi il codice sarà portatile!
Daniel

16

Se capisco la tua domanda, vuoi fare riferimento a variabili / proprietà membro nel tuo oggetto AppDelegate? Il modo più semplice è utilizzare [[UIApplication sharedApplication] delegate] per restituire un riferimento all'oggetto.

Se hai una proprietà chiamata finestra, puoi farlo:

UIWindow   *mainWindow = [[[UIApplication sharedApplication] delegate] window];
//do something with mainWindow

11

Ecco un'alternativa portatile ben definita per iOS4.0 e versioni successive:

UIApplication *myApplication = [UIApplication sharedApplication];
UIWindow *mainWindow = [myApplication keyWindow];
UIViewController *rootViewController = [mainWindow rootViewController];

oppure, in una riga,

UIViewController *rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController];

Non dimenticare di impostare la rootViewControllerproprietà della finestra (diciamo in IB) o questo andrà bene.


2

Definisci una macro e usala ovunque!

#define appDelegateShared ((AppDelegate *)[UIApplication sharedApplication].delegate)

Nel mio codice: -

UIViewController *rootViewController = appDelegateShared.window.rootViewController;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.