iphone objective-c ios

iphone - ¿Cómo puedo usar applicationDidBecomeActive en UIViewController?



objective-c ios (5)

Quiero volver a cargar los datos en UIViewController cuando la aplicación se active o se convierta en primer plano.

Sé que se llama a applicationDidBecomeActive en la clase AppDelegate.
Pero tengo que tener una variable global para UIViewController para volver a cargar sus datos en la clase AppDelegate como este código:

in AppDelegate.m // global variable UIViewController *viewController1; UIViewController *viewController2; -(void)applicationDidBecomeActive:(UIApplication *)application { [viewController1 reloadData]; [viewController2 reloadData]; }

Pero es inconveniente, especialmente cuando tengo muchos UIViewControllers.

¿Puedo usar applicationDidBecomeActive en UIViewController en lugar de en la clase AppDelegate?
¿O hay formas mejores que tener una variable global para UIViewController?

También necesito usar el siguiente método de UIViewControllers:

-(void)applicationWillResignActive:(UIApplication *)application -(void)applicationDidEnterBackground:(UIApplication *)application -(void)applicationWillEnterForeground:(UIApplication *)application


Aquí hay un ejemplo de registrar un controlador de notificaciones en Swift (adaptado de la respuesta de Apurv arriba):

override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver( self, selector: #selector(applicationDidBecomeActive(notification:)), name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil) } @objc func applicationDidBecomeActive(notification: NSNotification) { // do something }

Actualización para Swift 4.2 :

override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive), name: UIApplication.didBecomeActiveNotification, object: nil) } @objc func applicationDidBecomeActive(notification: NSNotification) { // Application is back in the foreground print("active") }


En el momento de la reactivación, si desea llevar una cosa en particular para un controlador de vista, debe registrar una notificación en su método viewDidLoad .

UIApplicationDidBecomeActiveNotification notificará automáticamente a su aplicación y controlador dado, si se registraron para ello.

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


Gracias a todos por responder mi pregunta.
Pero encontré una manera más fácil de usar applicationDidBecomeActive en UIViewController.

@implementation AppDelegate -(void)applicationDidBecomeActive:(UIApplication *)application { UIViewController<MyAppDelegate> *topViewController = (UIViewController<MyAppDelegate> *)navigationController.topViewController; if ([topViewController respondsToSelector:@selector(MyApplicationDidBecomeActive)]) { [topViewController MyApplicationDidBecomeActive]; } } @end @protocol MyAppDelegate @optional -(void)MyApplicationDidBecomeActive; @end


No puede usar applicationDidBecomeActive en viewController; no es un método para esa clase.

Sin embargo, puede usar el método applicationDidBecomeActive en AppDelegate para llamar a cualquier método en su controlador de vista que considere importante al iniciarlo. Simplemente mantenga un puntero en su controlador para que el delegado de la aplicación pueda alcanzarlo.

Lo que esos métodos podrían estar en su controlador de vista depende completamente de usted y de los detalles de su programa. Tal vez signifique llamar a un método de actualización personalizado en su controlador de vista o cualquier otra cosa que considere necesaria.

También puede usar NSNotificationCenter como se describe aquí, con muchas notificaciones del sistema disponibles para el inicio de la aplicación: http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html

Sin embargo, depender en gran medida de NSNotificationCenter es, en mi opinión, una buena forma de desorganizar una aplicación. Si llama a todo desde sus métodos principales solo en AppDelegate, siempre puede consultar ese método para saber exactamente qué está haciendo su aplicación al iniciarse. Si, en su lugar, utiliza NSNotificationCenter, podría tener acciones repartidas entre muchas clases / objetos y puede ser más difícil rastrear lo que está sucediendo. Como mencionó varios objetos de controlador, creo que es más sencillo y está organizado para llamar a todo desde applicationDidBecomeActive lugar de registrar cada viewcontroller para la misma notificación.


Swift 3 :

NotificationCenter.default.addObserver( self, selector: #selector(applicationDidBecomeActive(_:)), name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil) func applicationDidBecomeActive(_ notification: NSNotification) { // do something }

Nota: no olvides quitar al observador