¿Cómo accedo a mi viewController desde mi appDelegate? iOS

Tengo una aplicación para iOS que creé como una “aplicación basada en vista” en xCode. Solo tengo un viewController, pero se muestra automáticamente y no veo ningún código que lo vincule a mi aplicaciónDelegate. Necesito pasar los datos de mi appDelegate a mi viewController, pero no sé cómo hacerlo.

Mi aplicación delegate.h:

#import  @interface AppDelegate : UIResponder  @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) NSDictionary *queryStrings; @end 

Además, appDidFinishLoadingWithOptions:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. [[JMC sharedInstance] configureJiraConnect:@"https://cmsmech.atlassian.net/" projectKey:@"WTUPLOAD" apiKey:@"7fc060e1-a795-4135-89c6-a7e8e64c4b13"]; if ([launchOptions objectForKey:UIApplicationLaunchOptionsURLKey] != nil) { NSURL *url = [launchOptions objectForKey: UIApplicationLaunchOptionsURLKey]; NSLog(@"url received: %@", url); NSLog(@"query string: %@", [url query]); NSLog(@"host: %@", [url host]); NSLog(@"url path: %@", [url path]); queryStrings = [self parseQueryString:[url query]]; NSLog(@"query dictionary: %@", queryStrings); } else { queryStrings = [self parseQueryString:@"wtID=nil"]; } return YES; } 

Puedes acceder a ella con:

 MyViewController* mainController = (MyViewController*) self.window.rootViewController; 

Si anida su vista detrás de un controlador tabviewcontroller o de navegación, se lo devolverá y tendrá que acceder al controlador de vista dentro de él.

¿Qué hay de utilizar las buenas NSNotifications antiguas para enviar un mensaje del delegado de su aplicación a cualquier persona que esté escuchando (por ejemplo, su contorller de vista) que algo necesita ser actualizado? o puede usar Key Value Observing para que su controlador de vista pueda ver alguna propiedad en su delegado de aplicación.

Como solo tiene un controlador de vista, de forma genérica (independientemente de cómo se configuró su aplicación):

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

Si desea obtener cualquier otro UIViewController , no solo el rootViewController :

 UIWindow *window=[UIApplication sharedApplication].keyWindow; UIViewController *root = [window rootViewController]; UIStoryboard *storyboard = root.storyboard; CustomViewController *vcc =(CustomViewController *) [storyboard instantiateViewControllerWithIdentifier:@"storyBoardID"]; 

Rápida forma de hacerlo, puede llamarlo desde cualquier lugar, no solo delegar el pedido:

 /// EZSwiftExtensions - Gives you the VC on top so you can easily push your popups public var topMostVC: UIViewController? { var presentedVC = UIApplication.sharedApplication().keyWindow?.rootViewController while let pVC = presentedVC?.presentedViewController { presentedVC = pVC } if presentedVC == nil { print("EZSwiftExtensions Error: You don't have any views set. You may be calling them in viewDidLoad. Try viewDidAppear instead.") } return presentedVC } 

Está incluido como una función estándar en:

https://github.com/goktugyil/EZSwiftExtensions

Si utilizó la plantilla de la aplicación basada en la vista, se debe poder acceder al controlador de vista única a través de una propiedad del delegado de su aplicación. Es el mismo controlador de vista que se establece como el controlador de vista raíz del controlador de navegación.

Si por alguna razón su proyecto se configuró de manera diferente, puede obtener el controlador de vista raíz de la ventana, que debería ser el controlador de navegación, y luego obtener su controlador de vista superior.

EDITAR: Así que el problema es este: con iOS5 y guiones gráficos, Apple ha abstraído una gran cantidad de la configuración inicial a la que solía tener acceso (y aún lo hace si opta por no utilizar guiones gráficos). Han alterado los argumentos pasados ​​a main () y hacen más de la configuración en el guión gráfico (que en realidad es solo una punta). En mi humilde opinión, esto es en parte para evitar que la gente sobrecargue el AppDelegate con operaciones pesadas, como parece que está haciendo en el suyo. El AppDelegate, en esencia, existe para administrar el ciclo de vida de la Aplicación. En realidad, no está destinado a realizar métodos que entreguen información a sus controladores de vista. Es realmente el trabajo del controlador de tu vista hacer el trabajo pesado para obtener datos. Sugeriría mover el código en su controlador de vista, tal vez en viewDidLoad. Si necesita saber el resultado de la prueba launchOptions objectForKey que parece que está haciendo, puede simplemente crear una propiedad en su AppDelegate, decir BOOL launchOptionsURLKeyExists, y configurarla adecuadamente. Entonces solo agarras el valor de esta propiedad en tu controlador de vista. You AppDelegate ya es un singleton, por lo que puede acceder a él desde [UIApplication sharedApplication] .delegate

EDIT 2: se llama a viewWillAppear / viewDidAppear cuando la vista se agrega a la notificación UIApplicationDidEnterForegroundNotification en su controlador de vista y responde adecuadamente cuando se publica ese mensaje.