Manejo de la aplicaciónDidBecomeActive – “¿Cómo puede un controlador de vista responder a que la aplicación se active?”

Tengo el protocolo UIApplicationDelegate en mi clase principal AppDelegate.m, con el método applicationDidBecomeActive definido.

Quiero llamar a un método cuando la aplicación vuelve desde el fondo, pero el método está en otro controlador de vista. ¿Cómo puedo verificar qué controlador de vista se muestra actualmente en el método applicationDidBecomeActive y luego realizar una llamada a un método dentro de ese controlador?

Cualquier clase en su aplicación puede convertirse en un “observador” para diferentes notificaciones en la aplicación. Cuando cree (o cargue) su controlador de vista, querrá registrarlo como observador para UIApplicationDidBecomeActiveNotification y especificar a qué método desea llamar cuando se envía esa notificación a su aplicación.

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

¡No te olvides de limpiar después de ti! Recuerda retirarte como el observador cuando tu vista se vaya:

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

Más información sobre el Centro de notificaciones .

Swift 3, 4 Equivalente:

añadiendo un observador

 NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive), name: .UIApplicationDidBecomeActive, object: nil) 

eliminando al observador

 NotificationCenter.default.removeObserver(self, name: .UIApplicationDidBecomeActive, object: nil) 

llamar de vuelta

 @objc func applicationDidBecomeActive() { // handle event } 

Swift 2 Equivalente :

 let notificationCenter = NSNotificationCenter.defaultCenter() // Add observer: notificationCenter.addObserver(self, selector:Selector("applicationWillResignActiveNotification"), name:UIApplicationWillResignActiveNotification, object:nil) // Remove observer: notificationCenter.removeObserver(self, name:UIApplicationWillResignActiveNotification, object:nil) // Remove all observer for all notifications: notificationCenter.removeObserver(self) // Callback: func applicationWillResignActiveNotification() { // Handle application will resign notification event. } 

Con Swift 4, Apple aconseja a través de una nueva advertencia del comstackdor que evitemos el uso de #selector en este escenario. La siguiente es una forma mucho más segura de lograr esto:

En primer lugar, cree una varilla diferida que pueda ser utilizada por la notificación:

 lazy var didBecomeActive: (Notification) -> Void = { [weak self] _ in // Do stuff } 

Si necesita que se incluya la notificación real, solo reemplace _ con una notification .

A continuación, configuramos la notificación para observar que la aplicación se active.

 func setupObserver() { _ = NotificationCenter.default.addObserver(forName: .UIApplicationDidBecomeActive, object: nil, queue:.main, using: didBecomeActive) } 

El gran cambio aquí es que en lugar de llamar a #selector , ahora llamamos a la var creada anteriormente. Esto puede eliminar situaciones en las que se producen lockings de selector no válidos.

Finalmente, eliminamos al observador.

 func removeObserver() { NotificationCenter.default.removeObserver(self, name: .UIApplicationDidBecomeActive, object: nil) }