2008-10-23 12 views
83

Tengo un proyecto basado en la plantilla de la aplicación basada en la navegación. En AppDelegate están los métodos -applicationDidFinishLoading: y -applicationWillTerminate:. En esos métodos, estoy cargando y guardando los datos de la aplicación y almacenándolos en una variable de instancia (en realidad es un objeto-gráfico).Hacer referencia a variables de instancia de AppDelegate

Cuando se carga la aplicación, carga MainWindow.xib, que tiene un NavigationConroller, que a su vez tiene un RootViewController. La propiedad RootViewController nibName apunta a RootView (mi clase de controlador real).

En mi clase, deseo referirme al objeto que creé en el método -applicationDidFinishLoading:, para que pueda obtener una referencia.

¿Alguien me puede decir cómo hacerlo? Sé cómo hacer referencia entre los objetos que he creado mediante programación, pero parece que no puedo encontrar el hilo para volver, dado que el paso intermedio se realizó desde el archivo NIB.

Respuesta

15

Si entiendo su pregunta, ¿quiere hacer referencia a las variables/propiedades del miembro en su objeto AppDelegate? La forma más simple es usar el delegado [[UIApplication sharedApplication]] para devolver una referencia a su objeto.

Si usted tiene una propiedad llamada ventana, usted puede hacer esto:

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

Para las variables (por lo general el modelo de estructura de datos) que necesito para acceder a ella en cualquier lugar de la aplicación, declararlos en su Clase AppDelegate. Cuando tenga que hacer referencia a ella:

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

he votado en éste porque ha agregado el molde, es necesario echar AppDelegate a su propio tipo para que pueda ver sus propias propiedades que establece. Puede editar para que quede más claro al no incluir en "AppDelegate" ... –

+0

¿Hay alguna forma de acceder al controlador de la vista raíz sin hacer referencia al nombre del delegado de la aplicación o a ninguno de sus miembros? (Me gustaría escribir un código portátil que necesita el controlador de vista raíz). – SK9

+0

SK9, cada aplicación de iOS tiene que tener una aplicaciónDelegate, ¡así que el código será portátil! – Daniel

11

Aquí hay una alternativa bien definida portátil para iOS4.0 y hasta:

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

o, en una línea,

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

no hacer olvida establecer la propiedad rootViewController de la ventana (di en IB) o harás una toma.

1

que definen una macro y utilizar de esta manera: -

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

en mi código: -

appDelegateShared.myVariable=anotherVariable; 
Cuestiones relacionadas