ViewDidAppear no se llama al abrir la aplicación desde el background

Tengo un controller de vista en el que mi valor es 0 (label) y cuando abro ese controller de vista desde otro ViewController he configurado viewDidAppear para establecer el valor 20 en la label. Funciona bien pero cuando cierro mi aplicación y de nuevo abro mi aplicación pero el valor no cambia porque viewDidLoad , viewDidAppear y viewWillAppear no se viewWillAppear nada. ¿Cómo puedo llamar cuando abro mi aplicación? ¿Tengo que hacer algo desde applicationDidBecomeActive ?

Curioso acerca de la secuencia exacta de events, instrumenté una aplicación de la siguiente manera: (@Zohaib, puede usar el código NSNotificationCenter a continuación para responder a su pregunta).

 // AppDelegate.m - (void)applicationWillEnterForeground:(UIApplication *)application { NSLog(@"app will enter foreground"); } - (void)applicationDidBecomeActive:(UIApplication *)application { NSLog(@"app did become active"); } // ViewController.m - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"view did load"); [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil]; } - (void)appDidBecomeActive:(NSNotification *)notification { NSLog(@"did become active notification"); } - (void)appWillEnterForeground:(NSNotification *)notification { NSLog(@"will enter foreground notification"); } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; NSLog(@"view will appear"); } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; NSLog(@"view did appear"); } 

En el lanzamiento, el resultado se ve así:

 2013-04-07 09:31:06.505 myapp[15459:11303] view did load 2013-04-07 09:31:06.507 myapp[15459:11303] view will appear 2013-04-07 09:31:06.511 myapp[15459:11303] app did become active 2013-04-07 09:31:06.512 myapp[15459:11303] did become active notification 2013-04-07 09:31:06.517 myapp[15459:11303] view did appear 

Ingrese el background y vuelva a ingresar al primer plano:

 2013-04-07 09:32:05.923 myapp[15459:11303] app will enter foreground 2013-04-07 09:32:05.924 myapp[15459:11303] will enter foreground notification 2013-04-07 09:32:05.925 myapp[15459:11303] app did become active 2013-04-07 09:32:05.926 myapp[15459:11303] did become active notification 

Usando Objective-C

Debería registrar una UIApplicationWillEnterForegroundNotification en el método viewDidLoad y cada vez que la aplicación regrese de segundo plano, puede hacer lo que quiera hacer en el método registrado para la notificación. ViewController o viewDidAppear no se llamará cuando la aplicación regrese de segundo plano a primer plano.

 -(void)viewDidLoad{ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doYourStuff) name:UIApplicationWillEnterForegroundNotification object:nil]; } -(void)doYourStuff{ // do whatever you want to do when app comes back from background. } 

No olvide anular el logging de la notificación para la que está registrado.

 -(void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; } 

Tenga en count que si registra su viewController para UIApplicationDidBecomeActiveNotification , su método se llamará cada vez que su aplicación se active, no se recomienda registrar viewController para esta notificación.

Usando Swift

Para agregar un observador puede usar el siguiente código

  override func viewDidLoad() { super.viewDidLoad() NSNotificationCenter.defaultCenter().addObserver(self, selector:"doYourStuff", name: UIApplicationWillEnterForegroundNotification, object: nil) } func doYourStuff(){ // your code } 

Para eliminar el observador puede usar la function deinit de swift.

 deinit { NSNotificationCenter.defaultCenter().removeObserver(self) } 

Versión Swift 3.0

En su viewDidLoad , regístrese en el centro de notifications para escuchar esto abierto desde la acción en segundo plano

 NotificationCenter.default.addObserver(self, selector:#selector(doSomething), name: NSNotification.Name.UIApplicationWillEnterForeground, object: nil) 

Luego agregue esta function y realice la acción necesaria

 func doSomething(){ //... } 

Finalmente agregue esta function para limpiar el observador de notificación cuando se destruye el controller de vista.

 deinit { NotificationCenter.default.removeObserver(self) } 

Creo que registrarse para la UIApplicationWillEnterForegroundNotification es arriesgado, ya que puede terminar con más de un controller reactjsndo a esa notificación. Nada garantiza que estos controlleres todavía estén visibles cuando se recibe la notificación.

Esto es lo que hago: forzo la llamada viewDidAppear en el controller activo directamente desde el método didBecomeActive del delegado de la aplicación:

Agregue el código a continuación a - (void)applicationDidBecomeActive:(UIApplication *)application

 UIViewController *activeController = window.rootViewController; if ([activeController isKindOfClass:[UINavigationController class]]) { activeController = [(UINavigationController*)window.rootViewController topViewController]; } [activeController viewDidAppear:NO]; 

Simplemente UIApplicationWillEnterForegroundNotification que su controller de vista se registre para la notificación UIApplicationWillEnterForegroundNotification y reaccione en consecuencia.

intente agregar esto en la aplicación AppDelegate WillEnterForeground.

 func applicationWillEnterForeground(_ application: UIApplication) { // makes viewWillAppear run self.window?.rootViewController?.beginAppearanceTransition(true, animated: false) self.window?.rootViewController?.endAppearanceTransition() } 

Según la documentation de Apple:

 (void)beginAppearanceTransition:(BOOL)isAppearing animated:(BOOL)animated; 

Descripción:
Le dice a un controller secundario que su aspecto está a punto de cambiar. Si está implementando un controller de contenedor personalizado, use este método para decirle al niño que sus puntos de vista están a punto de aparecer o desaparecer . No invoque viewWillAppear: viewWillDisappear: viewDidAppear: o viewDidDisappear: directamente .

 (void)endAppearanceTransition; 

Descripción:

Le dice a un controller secundario que su aspecto ha cambiado. Si está implementando un controller de contenedor personalizado, use este método para decirle al niño que la transición de vista está completa.

Código de muestra:

 (void)applicationDidEnterBackground:(UIApplication *)application { [self.window.rootViewController beginAppearanceTransition: NO animated: NO]; // I commented this line [self.window.rootViewController endAppearanceTransition]; // I commented this line } 

Pregunta: ¿Cómo arreglé?

Respuesta : encontré esta pieza de líneas en la aplicación. Estas líneas hicieron que mi aplicación no recibiera ninguna notificación de ViewWillAppear. Cuando comenté estas líneas está funcionando bien .