2009-05-12 13 views
15

Tengo un AppDelegate que tiene 3 visualizaciones. Puedo añadir los tresHacer referencia a los métodos de AppDelegate - iphone

[window addSubview:gameViewController.view]; 
[window addSubview:viewSettings.view]; 
[window addSubview:viewController.view]; 
[window makeKeyAndVisible]; 

En el delegado de la aplicación, tengo algunos metodos para intercambiar puntos de vista llamando

[window bringSubviewToFront:gameViewController.view]; 

cuando estoy dentro de viewController, utilizo

pinkAppDelegate *appDelegate= (pinkAppDelegate *)[[UIApplication sharedApplication] delegate]; 

[appDelegate switchToSettings]; 

para cambiar mi subvistas ... hasta ahora todo bien.

PERO, cuando estoy en mi vistaConfigurando UIViewController, y hago la misma llamada appDelegate, se bloquea, como si no supiera cómo llamar al método appDelegate.

Tengo todos mis puntos de vista enganchados en mi xib MainWindow, pero no puedo entender por qué no puedo atravesar los métodos en el AppDelegate principal

+0

¿Te MAEN que '[[UIApplication sharedApplication] delegar]; '¿falla? o que no puedes enviar un mensaje 'switchToSettings' Es este tiempo de ejecución o compilación? –

+0

tiempo de ejecución ... no puedo enviar el mensaje. PUEDO desde una vista ... pero no desde otra ... – jalo

Respuesta

28

Dentro viewController, se está configurando una variable local llamada appDelegate que apunta a su delegado de la aplicación. Eso es lo que hace esta línea:

pinkAppDelegate *appDelegate= (pinkAppDelegate *)[[UIApplication sharedApplication] delegate]; 

Esta variable es local a viewController, por lo que no se puede utilizar en la vista de ajustes del controlador. Necesitas configurar otra variable allí.

O bien, use este #define agradable en toda su aplicación. (Tendrá que ponerla en un archivo de cabecera .h que incluye en cada archivo en su proyecto.)

#define myAppDelegate (MyAppDelegate *)[[UIApplication sharedApplication] delegate] 

A continuación, puede hacer lo siguiente en cualquier lugar: Respuesta

[myAppDelegate doSomething]; 
+0

¿Por qué no llamar directamente?: [[[UIApplication sharedApplicaion delegate] doSomething] – stefanB

+0

Aparte del hecho de que UIApplication no tendrá esos métodos personalizados de todos modos ... – stefanB

+0

@stefanB todo lo que [[UIApplication delegate shared blah blah es feo y esta solución ayuda a evitar errores como jalo tiene. –

1

de Jane tenía un error tipográfico en eso.

Usar la siguiente línea en un archivo de cabecera (por ejemplo defines.h) que se importa en cada clase:

#define myAppDelegate [[UIApplication sharedApplication] delegate] 

También es posible usar la línea en un archivo de cabecera de prefijo - esta es una manera fácil de tener acceso a esto en todas partes.

continuación, en cualquier método que puede utilizar cualquiera de los siguientes:

[myAppDelegate doSomething]; 
myAppDelegate.property=value; 
myAppDelegate.childClassOfMyAppDelegate.property=value; 
[myAppDelegate.ChildOfMyAppDelegate doSomething]; 
10

Como referencia todavía hay un error tipográfico en lo anterior, también tengo otra adición que ayuda a evitar las advertencias de tener que emitir cada vez. si se utiliza:

#import "MyAppDelegate.h" 
#define myAppDelegate (MyAppDelegate *) [[UIApplication sharedApplication] delegate] 

puse lo anterior en un constants.h y luego se puede utilizar

[myAppDelegate doSomething]; 

cualquier lugar importo constants.h

Cuestiones relacionadas