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)
}