74 votos

ViewDidAppear no se llama al Abrir la app de fondo

Tengo un Controlador de Vista en el que mi valor es 0 (etiqueta) y cuando abro el que el Controlador de Vista de otra ViewController os he puesto viewDidAppear para establecer el valor 20 en la etiqueta . y funciona bien, pero cuando cierro la aplicación y de nuevo puedo abrir mi aplicación, pero los valores no cambia porque viewDidLoad, viewDidAppear y viewWillAppear nada llamado . ¿cómo puedo llamar cuando abro la app. ¿tengo que hacer algo applicationDidBecomeActive?

167voto

danh Puntos 21498

Curiosidad acerca de la secuencia exacta de los acontecimientos, me instrumentado una aplicación como sigue: (@Zohaib, puede utilizar el NSNotificationCenter código de abajo para responder a tu 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(appDidEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];
}

- (void)appDidBecomeActive:(NSNotification *)notification {
    NSLog(@"did become active notification");
}

- (void)appDidEnterForeground:(NSNotification *)notification {
    NSLog(@"did 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 parece a esto:

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

Entrar en el fondo, a continuación, vuelva a escribir el 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] did 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

62voto

nsgulliver Puntos 8019

Usando Objective-C

Usted debe registrar un UIApplicationWillEnterForegroundNotification en su ViewController's viewDidLoad método y siempre que la aplicación viene de vuelta de fondo usted puede hacer lo que quiere hacer en el método registrado para la notificación. ViewController's viewWillAppear o viewDidAppear no será llamado cuando la aplicación vuelva de fondo hacia el frente.

-(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 olvides eliminar el registro de la notificación a que usted está inscrito.

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

Nota si usted registra su viewController para UIApplicationDidBecomeActiveNotification , a continuación, su método se llama cada vez que la aplicación se activa, no se recomienda registrarse viewController de esta notificación .

Mediante El Uso De Swift

Para añadir observador puede utilizar el código siguiente

 override func viewDidLoad() {
    super.viewDidLoad()

     NSNotificationCenter.defaultCenter().addObserver(self, selector:"doYourStuff", name:
     UIApplicationWillEnterForegroundNotification, object: nil)
 }

 func doYourStuff(){
  // your code
 }

Para quitar el observador puede utilizar la función deinit de swift.

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

3voto

Erwan Puntos 579

Creo que registrarse para el UIApplicationWillEnterForegroundnotification es arriesgado, ya que puede terminar con más de un controlador de reaccionar a la notificación. Nada de garanties que estos controladores son todavía visibles cuando la notificación es recibida.

Aquí es lo que hago: la fuerza de la llamada viewDidAppear en el activo de control directamente desde la Aplicación del delegado de la didBecomeActive método:

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];

2voto

andreagiavatto Puntos 698

Acaba de tener su punto de vista controlador registro de la UIApplicationWillEnterForegroundNotification de notificación y reaccionar en consecuencia.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X