2011-07-03 7 views
8

Esta es probablemente una pregunta novato, pero no puedo entenderlo.Xcode: conexión entre los controladores de vista y el delegado de la aplicación

¿Cómo hago una conexión entre 2 controladores de visualización o un controlador de vista y mi aplicación? lo que suelo hacer es añadir lo siguiente a mi aplicación delegado archivo "h"

@class RootViewController; 


@interface TabBarWithSplitViewAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> { 
    RootViewController *rootViewController; 



} 
@property (nonatomic, retain) IBOutlet RootViewController *rootViewController; 

@end 

y luego crear una conexión en el Interface Builder. desde mi controlador de vista raíz al delegado de la aplicación y automáticamente me dice que es el controlador raíz que agregué arriba.

y si lo hace en el delegado de la aplicación de archivos "m":

#import "RootViewController.h" 

NSLOG(@"Controller %@",rootViewController); 

le da un montón de números que indica que hay una conexión

pero como usted sabe con Xcode 4 de este cambiado ya que normalmente ya no tiene main.xib donde puede crear la conexión, usted hace casi todas esas conexiones programáticamente.

`ve intentó todo, desde usar el mismo código sin el "IBOutlet" para añadir:

rootViewController = [[RootViewController]alloc] init; 

pero nada parece funcionar.

¿Alguien puede ayudar?

Gracias de antemano

+0

¿Has mirado las notificaciones? No lo he intentado con XCode 4, pero podría funcionar para ti. –

+0

no puedo usar notificaciones ya que de hecho tengo que tener comunicación entre ellas. y cambiar las cosas en mi rootviewcontroller desde el appdelegate! – Ponchotg

Respuesta

16

Usted será básicamente desee crear un Ivar de su controlador de vista de delegado de la aplicación.

ViewController *myVC; 
@property (nonatomic, retain) IBOutlet ViewController *myVC; 

y luego sintetizarlo en el archivo de implementación.

Luego, cuando las cargas de vista del controlador, llamar a algo a lo largo de las líneas de esto:

- (void)viewDidLoad { 
    AppDelegateClass *appDelegate = (AppDelegateClass *)[[UIApplication sharedApplication] delegate]; 
    appDelegate.myVC = self; 
} 

En este punto, ahora tiene una conexión directa con el controlador de vista del delegado de la aplicación. Del mismo modo, podría hacer lo contrario para llamar a los métodos de delegado de aplicación desde el controlador de vista. En ese caso, configuraría un delegado en el encabezado del controlador de vista.

id delegate; 
@property (nonatomic, assign) id delegate; 

lo sintetiza de nuevo en el archivo de implementación.

Ahora, cuando usted está en viewDidLoad, que se dice algo como esto:

- (void)viewDidLoad { 
    self.delegate = (AppDelegateClass *)[[UIApplication sharedApplication] delegate]; 
} 

que debe darle lo que necesita para ponerse en marcha, así que espero que ayuda

+2

Sé que este es un hilo viejo pero creo que esto no es digno de una pregunta separada: intenté la primera parte de tu respuesta (conexión viewController-> appDelegate) pero en la línea 'appDelegate.myVC = self', dice Xcode '" La conversión implícita de un puntero de Objective-C a 'int *' no se permite con ARC "'. ¿Tu respuesta no fue solo ARC? Si es así, ¿podrías ayudarme? – tomsmeding

+0

Esto fue escrito antes del ARC, pero no debería verse afectado ya que no se llama 'retener' o' liberar'. Asegúrate de tener las funciones '@ property' correctas listas (en este caso, será algo así como @property (no atómico, fuerte) id delegate'). Además, asegúrese de estar pasando la variable correcta. El error que está recibiendo, específicamente la parte 'int *' definitivamente debe ser visto. Un 'int' nunca se debe pasar como un puntero, es decir,' int * '. Espero que eso ayude – justin

Cuestiones relacionadas