Hacer referencia a las variables de instancia de AppDelegate

84

Tengo un proyecto que se basa en la plantilla de aplicación basada en 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 gráfico de objeto).

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

En mi clase, deseo hacer referencia al objeto que creé en el -applicationDidFinishLoading:método, para poder obtener una referencia a él.

¿Puede alguien decirme cómo hacer eso? Sé cómo hacer referencia entre objetos que he creado mediante programación, pero parece que no puedo encontrar la manera de volver atrás, dado que el paso intermedio se realizó desde el archivo NIB.

Chris Hanson
fuente

Respuestas:

204

Para las variables (generalmente la estructura de datos del modelo) a las que necesito acceder en cualquier lugar de la aplicación, declarelas en su clase AppDelegate. Cuando necesite hacer referencia a él:

YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate];
//and then access the variable by appDelegate.variable 
Leonho
fuente
7
Voté este porque agregaste el elenco, necesitas transmitir AppDelegate a tu propio tipo para que puedas ver tus propias propiedades que configuraste. Sin embargo, puedes editar para que esto sea más claro si no envías a "AppDelegate" ...
Kendall Helmstetter Gelner
¿Hay alguna forma de acceder al controlador de vista raíz sin hacer referencia al nombre del delegado de la aplicación o cualquiera de sus miembros? (Me gustaría escribir un código portátil que necesite el controlador de vista raíz.)
SK9
SK9, todas las aplicaciones de iOS deben tener un appDelegate, por lo que el código será portátil.
Daniel
16

Si entiendo su pregunta, ¿desea hacer referencia a variables / propiedades de miembros en su objeto AppDelegate? La forma más sencilla es utilizar [[UIApplication sharedApplication] delegate] para devolver una referencia a su objeto.

Si tiene una propiedad llamada ventana, puede hacer esto:

UIWindow   *mainWindow = [[[UIApplication sharedApplication] delegate] window];
//do something with mainWindow
Ben Gottlieb
fuente
11

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

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

o, en una línea,

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

No olvide establecer la rootViewControllerpropiedad de la ventana (digamos en IB) o esto funcionará.

SK9
fuente
2

¡Defina una macro y úsela en cualquier lugar!

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

En mi código: -

UIViewController *rootViewController = appDelegateShared.window.rootViewController;
tryKuldeepTanwar
fuente