objective kits framework ios objective-c iphone xcode swift

ios - framework - xcode kits



No se llama a ViewDidAppear al abrir la aplicaciĆ³n desde el fondo (7)

Versión de Swift 3.0 ++

En su viewDidLoad , regístrese en el centro de notificaciones para escuchar esta acción abierta desde el fondo

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

A continuación, agregue esta función y realice la acción necesaria

func doSomething(){ //... }

Finalmente agregue esta función para limpiar el observador de notificación cuando se destruye su controlador de vista.

deinit { NotificationCenter.default.removeObserver(self) }

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


Creo que registrarse para UIApplicationWillEnterForegroundNotification es arriesgado ya que puede terminar con más de un controlador reaccionando a esa notificación. Nada garantiza que estos controladores sigan siendo visibles cuando se reciba la notificación.

Esto es lo que hago: fuerzo a llamar a viewDidAppear en el controlador activo directamente desde el método de delegado de la aplicación didBecomeActive:

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

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


Curioso acerca de la secuencia exacta de eventos, he instrumentado 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, la salida 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

Ingresa el fondo y luego vuelve 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


Según la documentación de Apple:

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

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

(void)endAppearanceTransition;

Descripción:

Le dice a un controlador de niño que su apariencia ha cambiado. Si está implementando un controlador 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 lo arreglé?

Respuesta : Encontré este pedazo de líneas en la aplicación. Estas líneas hacían que mi aplicación no recibiera ninguna notificación de ViewWillAppear. Cuando comencé estas líneas, funciona bien .


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


intente agregar esto en AppDelegate applicationWillEnterForeground.

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


Usando Objective-C

Debe registrar una UIApplicationWillEnterForegroundNotification en el método UIApplicationWillEnterForegroundNotification de su ViewController y cada vez que la aplicación vuelva desde el fondo puede hacer lo que quiera con el método registrado para la notificación. ViewController o viewDidAppear no se invocará cuando la aplicación vuelva de fondo 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 registro de la notificación para la que está registrado.

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

Tenga en cuenta que si registra su viewController para UIApplicationDidBecomeActiveNotification se UIApplicationDidBecomeActiveNotification su método cada vez que su aplicación se active. No se recomienda registrar viewController para esta notificación.

Usando Swift

Para agregar 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 observador puede usar la función deinit de swift.

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