¿Cómo decirle al controller de vista activo cuándo se llama a applicationDidBecomeActive?

Siento que me falta un truco aquí …

Solo quiero llamar a viewDidLoad o viewDidAppear en el controller actual de vista activa cuando se llama a applicationDidBecomeActive, por lo que puedo restablecer algunas animaciones o lo que sea, cuando la aplicación se inicia de nuevo desde el background. A algunos de mis puntos de vista no les importa, pero otros realmente necesitan saber.

Estoy usando Storyboards y el file de delegado de mi aplicación tiene las funciones estándar, pero todos con cuerpos EMPTY. Por ejemplo, didFinishLaunchingWithOptions simplemente devuelve SÍ y no hace nada más. Storyboard automágicamente hace todo lo que imagino.

Entonces, ¿cómo puedo hablar con el controller de vista actual desde mi delegado de la aplicación, en blanco y sin información?

Recomendaría usar notifications.

En el método applicationDidBecomeActive de la aplicación del delegado puesto en este código:

[[NSNotificationCenter defaultCenter] postNotificationName:@"appDidBecomeActive" object:nil]; 

En el método init de su controller de vista activo, suscríbase a la notificación.

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateStuff) name:@"appDidBecomeActive" object:nil]; 

Implementa el método "updateStuff" en tu controller y deberías poder hacer lo que quieras cuando la aplicación se active.

En lugar de enviar una notificación de su delegado de la aplicación, el sistema operativo envía una notificación automáticamente que puede observar:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(initSongInfo) name:UIApplicationDidBecomeActiveNotification object:nil]; 

y, por supuesto, asegúrese de dejar de observar algún time antes o dentro de su método dealloc, llamando a:

 [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil]; 

Versión Swift:

Puede agregar esta fila en su vistaDidLoad

 NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(viewDidBecomeActive), name: UIApplicationDidBecomeActiveNotification, object: nil) func viewDidBecomeActive(){ print("viewDidBecomeActive") } 

En lugar de tratar de rastrear qué ViewController está actualizado, puede enviar una NSNotification desde su AppDelegate y suscribirse a ella en su ViewController. De esta forma, el controller de vista realiza un seguimiento de si necesita o no llamar a viewDidAppear.

su AppDelegate tendrá una propiedad de window, esa window tendrá una propiedad rootViewController. Puede encontrar su viewController aquí.

Si está utilizando un TabBarController, el rootviewcontroller será el tabbarcontroller, y puede llamar al viewController seleccionado de tabbarcontroller para get el viewController actual.

 UIViewController *rootViewController = [[[[UIApplication shanetworkingApplication] delegate] window] rootViewController]; if ([rootViewController isKindOfClass:[UITabBarController Class]]) rootViewController = ((UITabBarController *)rootViewController).selectedViewController; else if ([rootViewController isKindOfClass:[UINavigationController Class]]) rootViewController = ((UINavigationController *)rootViewController).topViewController; [rootViewController viewDidAppear]; 

Si tiene una jerarquía de vistas más compleja con controlleres de navigation o vistas modal, puede invocar presentedViewController o topViewController.